Java-验证码图片生成器

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介: Java-验证码图片生成器

基本参数

/**
 * 随机验证码生成访问
 */
private static final String RANGE_RANDOM_STR = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

/**
 * 图片尺寸设置
 */
private static final int WIDTH = 100;
private static final int HEIGHT = 32;

/**
 * 干扰线段数量
 */
private static final int LINE_NUM = 40;

/**
 * 随机验证码个数
 */
private static final int STE_NUM = 4;

/**
 * 验证码默认字体
 */
private static final Font DEFAULT_FONT =  new Font("Times New Roman", Font.ROMAN_BASELINE, 22);

/**
 * 随机数工具
 */
private static final Random RANDOM = new Random();

获取随机字符串

public static String getRandomString() {
    StringBuffer rssb = new StringBuffer();
    for(int index = 0; index < STE_NUM; index++) {
        rssb.append(RANGE_RANDOM_STR.charAt(RANDOM.nextInt(RANGE_RANDOM_STR.length())));
    }
    return rssb.toString();
}

获得随机颜色

private static Color getRandColor(int fc, int bc) {
    if (fc > 255) fc = 255;
    if (bc > 255) bc = 255;
    int r = fc + RANDOM.nextInt(bc - fc - 16);
    int g = fc + RANDOM.nextInt(bc - fc - 14);
    int b = fc + RANDOM.nextInt(bc - fc - 18);
    return new Color(r, g, b);
}

绘制干扰线

private static void drowLine(Graphics graphics) {
    int x = RANDOM.nextInt(WIDTH);
    int y = RANDOM.nextInt(HEIGHT);
    int xl = RANDOM.nextInt(13);
    int yl = RANDOM.nextInt(15);
    graphics.drawLine(x, y, x + xl, y + yl);
}

绘制字符串

private static void drowString(Graphics graphics, String randomString) {
    // 设置字体样式
    graphics.setFont(DEFAULT_FONT);
    // 设置字体颜色
    graphics.setColor(new Color(RANDOM.nextInt(101), RANDOM.nextInt(111), RANDOM.nextInt(121)));
    graphics.translate(RANDOM.nextInt(3), RANDOM.nextInt(3));
    graphics.drawString(randomString, 20, 20);
}

获取图片

/**
 * 获取图片验证码。
 */
public static BufferedImage getImage(String randomString) {
    // 创建绘图对象
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_BGR);
    Graphics graphics = image.getGraphics();
    // 绘图大小
    graphics.fillRect(0, 0, WIDTH, HEIGHT);
    // 字体大小
    graphics.setFont(DEFAULT_FONT);
    // 字体颜色
    graphics.setColor(getRandColor(110, 133));
    // 绘制干扰线
    for (int i = 0; i <= LINE_NUM; i++) {
        drowLine(graphics);
    }
    // 绘制随机字符串
    drowString(graphics, randomString);
    graphics.dispose();
    return image;
}

/**
 * 获取图片验证码。
 */
public static BufferedImage getImage() {
    return getImage(getRandomString());
}

HTTP响应设置

// 设置相应类型。输出的内容为图片
response.setContentType("image/jpeg");
// 设置响应头信息。不要缓存
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expire", 0);
try {
    // 根据随机字符串,生成图片对象
    String randomString = VerifyUtils.getRandomString();
    BufferedImage image = VerifyUtils.getImage(randomString);
    // 将内存中的图片通过流动形式输出到客户端
    ImageIO.write(image, "JPEG", response.getOutputStream());
} catch (IOException e) {
    LOGGER.error("IOException : {}", e.getMessage(), e);
}
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
20天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
48 4
|
20天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
49 2
|
26天前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
44 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
19天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
26天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
17 1
|
26天前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
45 1
|
26天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
91 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
Java
Java 登录输入的验证码
Java 登录输入的验证码
22 1
|
2月前
|
Java
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
这篇文章介绍了Java中FileInputStream和FileOutputStream的使用,包括如何读取和写入txt文件以及如何拷贝图片文件。
Java-FileInputStream和FileOutputStream的使用,txt文件及图片文件的拷贝
|
26天前
|
算法 小程序 Java
java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。
36 0