在JavaWeb开发中,使用java.awt.image.BufferedImage生成验证码是最基础也最常用的做法。它能在内存中维护一个可读写的图像缓冲区,配合Graphics对象完成字符与线条的绘制,最后通过ImageIO写出到浏览器或文件。

一、创建BufferedImage画布
验证码图像一般使用TYPE_INT_RGB类型,指定宽高和类型即可得到一个空画布。代码如下:
import java.awt.image.BufferedImage; // 宽度100,高度40,RGB类型 BufferedImage image = new BufferedImage(100, 40, BufferedImage.TYPE_INT_RGB);
二、获取绘图上下文并填充背景
通过getGraphics()拿到Graphics对象,先填充白色背景,避免默认黑色影响观察:
import java.awt.Graphics; import java.awt.Color; Graphics g = image.getGraphics(); // 填充背景为白色 g.setColor(Color.WHITE); g.fillRect(0, 0, 100, 40);
三、绘制验证码字符
通常从固定字符集中随机取4位,设置字体与颜色后逐个绘制。注意字体需支持中文或数字字母:
import java.awt.Font;
import java.util.Random;
String chars = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
Random rand = new Random();
g.setFont(new Font("Arial", Font.BOLD, 28));
StringBuilder code = new StringBuilder();
for (int i = 0; i < 4; i++) {
char c = chars.charAt(rand.nextInt(chars.length()));
code.append(c);
// 随机颜色
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
g.drawString(String.valueOf(c), 10 + i * 22, 30);
}
// code.toString()即为验证码文本,可存入session
四、添加干扰线
为降低机器识别率,可画几条随机位置的干扰线:
for (int i = 0; i < 5; i++) {
g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255)));
int x1 = rand.nextInt(100);
int y1 = rand.nextInt(40);
int x2 = rand.nextInt(100);
int y2 = rand.nextInt(40);
g.drawLine(x1, y1, x2, y2);
}
g.dispose();
五、输出图像流
使用ImageIO将BufferedImage写为JPEG或PNG字节流,在Servlet中可直接写向response:
import javax.imageio.ImageIO; import java.io.OutputStream; OutputStream out = response.getOutputStream(); ImageIO.write(image, "JPEG", out); out.flush();
常见问题说明
- 绘图后必须调用Graphics的dispose()释放资源。
- 若页面显示红叉,检查response的ContentType是否设为image/jpeg。
- 字符集若含中文,Font不能只写英文字体名,否则出现方块。
通过上述步骤,利用java.awt.image.BufferedImage即可完成验证码图像绘制的基础处理,后续可加入扭曲、旋转或噪点让验证码更安全。
java.awt.image.BufferedImage验证码图像绘制修改时间:2026-07-28 07:12:18