java 生成图片验证码
时间: 2023-10-14 19:17:31 浏览: 265
Java中生成图片验证码的步骤如下:
1. 创建一个 BufferedImage 对象,指定宽度、高度和图片类型(如 BufferedImage.TYPE_INT_RGB)。
2. 获取 BufferedImage 对象的 Graphics2D 对象,用于绘制验证码。
3. 设置验证码的背景色和边框颜色。
4. 生成随机验证码字符串,并将其绘制到图片上。
5. 绘制干扰线和噪点,增加验证码的可读性和安全性。
6. 将 BufferedImage 对象输出为图片文件或输出流。
以下是一个简单的示例代码:
```
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
public class CaptchaGenerator {
private static final int WIDTH = 120; // 图片宽度
private static final int HEIGHT = 40; // 图片高度
private static final int CODE_LENGTH = 4; // 验证码长度
private static final int LINE_COUNT = 10; // 干扰线数量
private static final int NOISE_COUNT = 100; // 噪点数量
public static BufferedImage generate() {
BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
// 设置背景色和边框颜色
g.setColor(Color.WHITE);
g.fillRect(0, 0, WIDTH, HEIGHT);
g.setColor(Color.BLACK);
g.drawRect(0, 0, WIDTH - 1, HEIGHT - 1);
// 生成随机验证码字符串,并绘制到图片上
Random random = new Random();
StringBuilder code = new StringBuilder(CODE_LENGTH);
for (int i = 0; i < CODE_LENGTH; i++) {
char ch = (char) (random.nextInt(26) + 'A');
code.append(ch);
g.drawString(String.valueOf(ch), (i + 1) * (WIDTH / (CODE_LENGTH + 1)), HEIGHT / 2);
}
// 绘制干扰线和噪点
for (int i = 0; i < LINE_COUNT; i++) {
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g.drawLine(random.nextInt(WIDTH), random.nextInt(HEIGHT), random.nextInt(WIDTH), random.nextInt(HEIGHT));
}
for (int i = 0; i < NOISE_COUNT; i++) {
g.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256)));
g.fillRect(random.nextInt(WIDTH), random.nextInt(HEIGHT), 1, 1);
}
g.dispose();
return image;
}
}
```
可以调用 `generate()` 方法生成一个 BufferedImage 对象,然后将其保存为文件或输出流。例如,将图片保存到文件的代码如下:
```
BufferedImage image = CaptchaGenerator.generate();
ImageIO.write(image, "PNG", new File("captcha.png"));
```
或者将图片以流的形式输出到客户端:
```
BufferedImage image = CaptchaGenerator.generate();
response.setContentType("image/png");
ImageIO.write(image, "PNG", response.getOutputStream());
```
阅读全文