package com.zsz.util; import java.awt.*; import java.awt.image.BufferedImage; import java.util.Random; /** * @project: ssm_sms * @description: 绘制验证码图片 */ public class CreateVerifiCodeImage { // 定义验证码图片的宽度为 90 像素 private static int WIDTH = 90; // 定义验证码图片的高度为 35 像素 private static int HEIGHT = 35; // 定义验证码字符的大小为 20 private static int FONT_SIZE = 20; // 用于存储生成的验证码字符数组 private static char[] verifiCode; // 用于存储生成的验证码图片对象 private static BufferedImage verifiCodeImage; /** * @description: 获取验证码图片 * @param: 无 * @return: java.awt.image.BufferedImage 类型的验证码图片 */ public static BufferedImage getVerifiCodeImage() { // 创建一个指定宽度、高度和图像类型(TYPE_INT_BGR)的 BufferedImage 对象 verifiCodeImage = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR); // 获取图片的 Graphics 对象,用于绘制图形和文本 Graphics graphics = verifiCodeImage.getGraphics(); // 生成验证码字符数组 verifiCode = generateCheckCode(); // 绘制验证码图片的背景 drawBackground(graphics); // 在图片上绘制生成的验证码字符 drawRands(graphics, verifiCode); // 释放 Graphics 对象所占用的系统资源 graphics.dispose(); // 返回生成的验证码图片 return verifiCodeImage; } /** * @description: 获取验证码 * @param: 无 * @return: 包含验证码字符的 char 类型数组 */ public static char[] getVerifiCode() { return verifiCode; } /** * @description: 随机生成验证码 * @param: 无 * @return: 包含 4 个随机字符的 char 类型数组 */ private static char[] generateCheckCode() { // 定义包含数字、小写字母和大写字母的字符集字符串 String chars = "0123456789abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 创建一个长度为 4 的字符数组,用于存储生成的验证码字符 char[] rands = new char[4]; // 循环 4 次,每次生成一个随机字符并存储到字符数组中 for (int i = 0; i < 4; i++) { // 生成一个随机索引,范围是 0 到字符集长度减 1 int rand = (int) (Math.random() * (10 + 26 * 2)); // 根据随机索引从字符集中获取一个字符,并存储到字符数组中 rands[i] = chars.charAt(rand); } // 返回生成的验证码字符数组 return rands; } /** * @description: 绘制验证码 * @param: g 用于绘制的 Graphics 对象 * @param: rands 包含验证码字符的字符数组 * @return: 无 */ private static void drawRands(Graphics g, char[] rands) { // 设置绘制文本的字体为 Console 字体,加粗,大小为 FONT_SIZE g.setFont(new Font("Console", Font.BOLD, FONT_SIZE)); // 遍历验证码字符数组,将每个字符绘制到图片上 for (int i = 0; i < rands.length; i++) { // 获取一个随机颜色 g.setColor(getRandomColor()); // 在指定的 x 和 y 坐标位置绘制验证码字符 g.drawString("" + rands[i], i * FONT_SIZE + 10, 25); } } /** * @description: 绘制验证码图片背景 * @param: g 用于绘制的 Graphics 对象 * @return: 无 */ private static void drawBackground(Graphics g) { // 设置绘制颜色为白色 g.setColor(Color.white); // 使用白色填充整个图片区域 g.fillRect(0, 0, WIDTH, HEIGHT); // 绘制 200 个干扰点 for (int i = 0; i < 200; i++) { // 生成一个随机的 x 坐标 int x = (int) (Math.random() * WIDTH); // 生成一个随机的 y 坐标 int y = (int) (Math.random() * HEIGHT); // 获取一个随机颜色 g.setColor(getRandomColor()); // 在指定的 x 和 y 坐标位置绘制一个 1x1 的椭圆(即一个点) g.drawOval(x, y, 1, 1); } } /** * @description: 获取随机颜色 * @param: 无 * @return: java.awt.Color 类型的随机颜色 */ private static Color getRandomColor() { // 创建一个 Random 对象,用于生成随机数 Random ran = new Random(); // 根据随机生成的红、绿、蓝分量值创建一个颜色对象并返回 return new Color(ran.nextInt(220), ran.nextInt(220), ran.nextInt(220)); } }