java中动态生成验证码图片
public class VerifyCode {
private static String[] fontNames = { "宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312" };
private static String codes = "23456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
private Color bgColor = new Color(255, 255, 255);
private int base = 30;
private int width = base * 4;
private int height = base;
private int len = 4;
private int fontSize = 22;
private String text;
private BufferedImage img = null;
private Graphics2D g2 = null;
public void drawImage(OutputStream outputStream) {
img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
g2 = (Graphics2D) img.getGraphics();
g2.setColor(bgColor);
g2.fillRect(0, 0, width, height);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < len; i++) {
g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),getRandom(0, 150)));
g2.setFont(new Font(fontNames[getRandom(0, fontNames.length)], Font.BOLD, fontSize));
int theta = getRandom(-45, 45);
g2.rotate(theta * Math.PI / 180, 7 + i * base, height - 8);
String code = codes.charAt(getRandom(0, codes.length())) + "";
g2.drawString(code, 7 + i * base, height - 8);
sb.append(code);
g2.rotate(-theta * Math.PI / 180, 7 + i * base, height - 8);
}
this.text = sb.toString();
for (int i = 0; i < len + 2; i++) {
g2.setColor(new Color(getRandom(0, 150), getRandom(0, 150),
getRandom(0, 150)));
g2.drawLine(getRandom(0, 120), getRandom(0, 30), getRandom(0, 120),
getRandom(0, 30));
}
g2.setColor(Color.GRAY);
g2.drawRect(0, 0, width-1, height-1);
try {
ImageIO.write(this.img, "JPEG", outputStream);
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}finally{
g2.dispose();
}
}
public String getCode() {
return this.text;
}
private static int getRandom(int start, int end) {
Random random = new Random();
return random.nextInt(end - start) + start;
}
}