这里只列出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);
}