2026-03-11 04:03:08
使用Java生成图形验证码的核心步骤包括随机字符生成、画布创建与绘制、干扰元素添加和图片格式输出。以下是具体实现方案:
1. 随机生成验证码字符验证码通常由4-6位字母和数字组成,可通过随机数从字符集中选取:
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";Random random = new Random();StringBuilder code = new StringBuilder();for (int i = 0; i < 4; i++) { int index = random.nextInt(chars.length()); code.append(chars.charAt(index));}String verificationCode = code.toString();2. 创建画布并绘制基础内容使用BufferedImage创建画布,通过Graphics2D绘制背景和验证码文字:
BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB);Graphics2D g2d = image.createGraphics();// 设置白色背景g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, 80, 30);// 设置黑色文字g2d.setColor(Color.BLACK);g2d.setFont(new Font("Arial", Font.BOLD, 20));// 绘制验证码(需调整坐标避免截断)g2d.drawString(verificationCode, 10, 20);3. 添加干扰元素增强安全性通过干扰线、噪点和背景渐变提高破解难度:
通过ImageIO将图像以PNG格式输出到响应流或文件:
// 输出到响应流(如Servlet)response.setContentType("image/png");ImageIO.write(image, "PNG", response.getOutputStream());// 输出到本地文件ImageIO.write(image, "PNG", new File("verification_code.png"));完整代码示例import java.awt.*;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import java.util.Random;import javax.imageio.ImageIO;public class CaptchaGenerator { public static void main(String[] args) throws IOException { // 1. 生成随机验证码 String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; Random random = new Random(); StringBuilder code = new StringBuilder(); for (int i = 0; i < 4; i++) { code.append(chars.charAt(random.nextInt(chars.length()))); } String verificationCode = code.toString(); // 2. 创建画布 BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB); Graphics2D g2d = image.createGraphics(); // 3. 绘制背景渐变 GradientPaint gradient = new GradientPaint(0, 0, Color.LIGHT_GRAY, 80, 30, Color.WHITE); g2d.setPaint(gradient); g2d.fillRect(0, 0, 80, 30); // 4. 绘制验证码文字 g2d.setColor(Color.BLACK); g2d.setFont(new Font("Arial", Font.BOLD, 20)); g2d.drawString(verificationCode, 10, 20); // 5. 添加干扰线 for (int i = 0; i < 5; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.drawLine(random.nextInt(80), random.nextInt(30), random.nextInt(80), random.nextInt(30)); } // 6. 添加噪点 for (int i = 0; i < 50; i++) { g2d.setColor(new Color(random.nextInt(256), random.nextInt(256), random.nextInt(256))); g2d.fillOval(random.nextInt(80), random.nextInt(30), 1, 1); } // 7. 输出图片 ImageIO.write(image, "PNG", new File("captcha.png")); g2d.dispose(); }}关键注意事项