这里只列出java的核心代码,可以根据自己使用场景及需要进行修改,如使用到jsp页面等。

也可以自己实现对一些不雅中文字的过滤等:

* 生成中文图片验证码
 * 
 * @throws Exception
 */
public static void generateImgCode() throws Exception {
	// 随机生成字体
	String[] fontTypes = { "\u5b8b\u4f53", "\u65b0\u5b8b\u4f53",
			"\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66" };
	// 设置图片的长宽
	int width = 176, height = 30;
	// 创建内存图像
	BufferedImage image = new BufferedImage(width, height,
			BufferedImage.TYPE_INT_RGB);
	// 获取图形上下文
	Graphics g = image.getGraphics();
	// 创建随机类的实例
	Random random = new Random();
	// 设定图像背景色(因为是做背景,所以偏淡)
	g.setColor(getRandColor(random, 200, 250));
	g.fillRect(0, 0, width, height);
	// 在图片背景上增加噪点
	g.setColor(getRandColor(random, 160, 200));
	g.setFont(new Font("Times New Roman", Font.PLAIN, 14));
	for (int i = 0; i < 6; i++) {
		g.drawString("****************************", 0, 5 * (i + 2));
	}
	// 保存生成的汉字字符串
	String sRand = "";
	for (int i = 0; i < 6; i++) {
		// 取随机产生的汉字
		String rand = getRandomChar();
		sRand += rand;
		// 设置字体的颜色
		g.setColor(getRandColor(random, 10, 150));
		// 设置字体
		g.setFont(new Font(fontTypes[random.nextInt(fontTypes.length)],
				Font.BOLD, 18 + random.nextInt(6)));
		// 将此汉字画到图片上
		g.drawString(rand, 24 * i + 10 + random.nextInt(8), 24);
	}
	g.dispose();
	// 设置页面不缓存
	// response.setHeader("Pragma", "No-cache");
	// response.setHeader("Cache-Control", "no-cache");
	// response.setDateHeader("Expires", 0);
	// 输出到页面
	// ImageIO.write(image, "JPEG", response.getOutputStream());
	// 输出验证码
	System.out.println(sRand);
	// 输出图象
	OutputStream os = new FileOutputStream(new File("d:/imgCode.jpg"));
	ImageIO.write(image, "JPEG", os);
}
/**
 * 生成随机汉字 原理是从汉字区位码找到汉字 在汉字区位码中分高位与底位, 其中有简体又有繁体,位数越前生成的汉字繁体的机率越大。
 * 在本例中高位从171取,底位从161取, 去掉大部分的繁体和生僻字,但仍然会有!!
 * 
 * @return
 * @throws UnsupportedEncodingException
 */
public static String getRandomChar() throws UnsupportedEncodingException {
	String str = null;
	// 定义高低位
	int hightPos, lowPos;
	Random random = new Random();
	// 获取高位值
	hightPos = (176 + Math.abs(random.nextInt(39)));
	// 获取低位值
	lowPos = (161 + Math.abs(random.nextInt(93)));
	byte[] b = new byte[2];
	b[0] = (new Integer(hightPos).byteValue());
	b[1] = (new Integer(lowPos).byteValue());
	// 转成中文
	str = new String(b, "GBk");
	return str;
}
/**
 * 生成随机颜色
 * 
 * @param random
 * @param fc
 * @param bc
 * @return
 */
private static Color getRandColor(Random random, int fc, int bc) {
	if (fc > 255)
		fc = 255;
	if (bc > 255)
		bc = 255;
	int r = fc + random.nextInt(bc - fc);
	int g = fc + random.nextInt(bc - fc);
	int b = fc + random.nextInt(bc - fc);
	return new Color(r, g, b);
}
你可能感兴趣的内容
0条评论

selfly

交流QQ群:32261424
Owner