工具类源码

import org.apache.commons.codec.binary.Base64;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.QuadCurve2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;/*** 生成验证码工具类** @author whw* @date 2020/1/7 16:49*/
public class CaptchaUtil {/*** 默认宽度*/private static final int WIDTH = 108;/*** 默认高度*/private static final int HEIGHT = 40;/*** 默认长度*/private static final int CODE_SIZE = 4;/*** 验证码随机字符数组*///private static final char[] CHAR_ARRAY = "23456789ABCDEFGHJKMNPQRSTUVWXY".toCharArray();private static final char[] CHAR_ARRAY = "0123456789".toCharArray();/*** 生成随机类*/private static final Random RANDOM = new Random();/*** 验证码字体*/private static final Font[] RANDOM_FONT = new Font[]{new Font(Font.DIALOG, Font.BOLD, 33),new Font(Font.DIALOG_INPUT, Font.BOLD, 34),new Font(Font.SERIF, Font.BOLD, 33),new Font(Font.SANS_SERIF, Font.BOLD, 34),new Font(Font.MONOSPACED, Font.BOLD, 34)};/*** 生成验证码** @param code* @return*/public static Map<String, String> generate(String code) {Map<String, String> map = new HashMap<>(2);BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);ByteArrayOutputStream baos = new ByteArrayOutputStream();try {drawGraphic(image, code);ImageIO.write(image, "jpeg", baos);//转换成字节byte[] bytes = baos.toByteArray();//转换成base64串String base64 = Base64.encodeBase64String(bytes);//删除 \r\nbase64 = base64.replaceAll("\n", "").replaceAll("\r", "");map.put("base64", "data:image/jpeg;base64," + base64);map.put("code", code);baos.close();} catch (Exception e) {throw new RuntimeException(e);}return map;}/*** 生成验证码字符串*/public static String generateCode() {int count = CODE_SIZE;char[] buffer = new char[count];for (int i = 0; i < count; i++) {buffer[i] = CHAR_ARRAY[RANDOM.nextInt(CHAR_ARRAY.length)];}return new String(buffer);}/*** 绘制图形** @param image* @param code*/private static void drawGraphic(BufferedImage image, String code) {// 获取图形上下文Graphics2D g = image.createGraphics();g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);// 图形抗锯齿g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 字体抗锯齿g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);// 设定背景色,淡色g.setColor(getRandColor(210, 250));g.fillRect(0, 0, WIDTH, HEIGHT);// 画小字符背景Color color = null;for (int i = 0; i < 20; i++) {color = getRandColor(120, 200);g.setColor(color);String rand = String.valueOf(CHAR_ARRAY[RANDOM.nextInt(CHAR_ARRAY.length)]);g.drawString(rand, RANDOM.nextInt(WIDTH), RANDOM.nextInt(HEIGHT));color = null;}// 取随机产生的认证码(4位数字)char[] buffer = code.toCharArray();for (int i = 0; i < buffer.length; i++) {//旋转度数 最好小于45度int degree = RANDOM.nextInt(28);if (i % 2 == 0) {degree = degree * (-1);}//定义坐标int x = 22 * i, y = 21;//旋转区域g.rotate(Math.toRadians(degree), x, y);//设定字体颜色color = getRandColor(20, 130);g.setColor(color);//设定字体,每次随机g.setFont(RANDOM_FONT[RANDOM.nextInt(RANDOM_FONT.length)]);//将认证码显示到图象中g.drawString("" + buffer[i], x + 8, y + 10);//旋转之后,必须旋转回来g.rotate(-Math.toRadians(degree), x, y);}//图片中间曲线,使用上面缓存的colorg.setColor(color);//width是线宽,float型BasicStroke bs = new BasicStroke(3);g.setStroke(bs);//画出曲线QuadCurve2D.Double curve = new QuadCurve2D.Double(0d, RANDOM.nextInt(HEIGHT - 8) + 4, WIDTH / 2, HEIGHT / 2, WIDTH, RANDOM.nextInt(HEIGHT - 8) + 4);g.draw(curve);// 销毁图像g.dispose();}/*** 给定范围获得随机颜色** @param fc* @param bc* @return*/private static Color getRandColor(int fc, int bc) {fc = Math.min(fc, 255);bc = Math.min(bc, 255);int r = fc + RANDOM.nextInt(bc - fc);int g = fc + RANDOM.nextInt(bc - fc);int b = fc + RANDOM.nextInt(bc - fc);return new Color(r, g, b);}
}

调用方法

// 获取验证码code
String code = CaptchaUtil.generateCode();
// 传入code生成验证码对象
Map<String, String> captchaMap = CaptchaUtil.generate(code);

生成之后返回的是一个Map,Map中包含了codebase64码两个对象:

前端渲染

直接将base64码放到img标签的src属性里即可

Java验证码图片工具类相关推荐

  1. Java旋转图片工具类

    前言: 本文提供可以任意角度(最小精度1度),旋转图片的Java工具类,旋转后的图片不会失真或丢失边角,根据角度参数,重新绘制图片,达到无损旋转的目的. 一.图片工具类 import java.awt ...

  2. java 图形校验_java图形验证码生成工具类 web页面校验验证码

    java图形验证码生成工具类 web页面校验验证码 发布于 2020-7-14| 复制链接 摘记: 最近做验证码,参考网上案例,发现有不少问题,特意进行了修改和完善.验证码生成器: ```java i ...

  3. java图形验证码生成工具类

    转载自   java图形验证码生成工具类 生成验证码效果       ValidateCode.java 验证码生成类 package cn.dsna.util.images; import java ...

  4. Java之png图片工具类

    import java.awt.Graphics2D; import java.awt.Image; import java.awt.Transparency; import java.awt.ima ...

  5. Java 旋转、翻转图片工具类(附代码) | Java工具类

    目录 前言 Maven依赖 代码 总结 前言 本文提供java操作图片生成旋转.翻转后的图片工具类,拿来即用. Maven依赖 <dependency><groupId>com ...

  6. 整理Java相关的工具类Utils,持续更新中,建议收藏【目前更新至24】

    文章目录 1.BigDecimalUtil 2.CaptchaUtil 图片验证码工具类 3.CoordinateTransformUtil 坐标系转换工具类 4.DateUtil 日期加减工具类 5 ...

  7. 验证码识别服务器,一个非常好用的验证码识别工具类api接口

    一个非常好用的验证码识别工具类api接口 群发?批量操作?验证码?可能乖孩子对于这些单个有了解,但是对于合在一起就不知道其存在的意义.这个对 于我们日常的生活可能是没有什么用处的,但是对于需要批量检测 ...

  8. Java导入Excel工具类使用教程

    前言: 本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi包.支持RESTful API,支持Spring ...

  9. Java身份证校验工具类

    Java身份证校验工具类 工作中经常会涉及到身份证的校验,而且需求不同,有的需要校验最后一位校验位,有的不需要,这里参考了几篇文章及自己工作中用到的情况写了一个工具类.记录一下,菜鸟一个,大佬勿喷. ...

最新文章

  1. Linux的epoll
  2. 常考数据结构与算法:两数之和
  3. Python创建删除文件(或文件夹)
  4. ORACLE数据库表空间备份方案
  5. 怎么制作铁闸门_红茶拿铁
  6. innodb存储引擎 - 锁
  7. Mybatis源码日志模块分析
  8. [李景山php]每天TP5-20161225|thinkphp5-Console.php-2
  9. php mysql 内存表_用mysql内存表来代替php session的类_PHP教程
  10. 各代iphone尺寸_iphone屏幕尺寸比例是多少,iphone各代屏幕尺寸大小介绍
  11. chrome遭劫持7654网站,怎么办?
  12. 计算机专业研究生和本科生工资差距,本科生和研究生的工资差距,到底有多大?...
  13. 新体育杂志新体育杂志社新体育杂志社新体育编辑部2022年第8期目录
  14. linux测试上下行最大网速和实时网速
  15. 定义类Shape作为父类,并在类中定义方法求周长和面积; (2)定义Shape子类圆形(circle),具有半径属性和常量PI,同时重写父类中的方法; (3)定义Shape子类长方形(rect
  16. java postgresql date_javapostgresql时区总结
  17. 数学方法生成六位随机数
  18. 【YBT2022寒假Day8 A】染色计划(Tarjan)(线段树优化建边)(树链剖分)
  19. 简易交通灯控制电路设计
  20. UTF8、UTF16、UTF32区别

热门文章

  1. 中国三大互联网巨头陷入移动战争
  2. 入华商用四周年,Office 365小程序在路上
  3. GD32F470之串口空闲中断+DMA篇
  4. 深大uooc学术道德与学术规范教育第二章
  5. 7.17正则表达式与re模块
  6. php直播表情美颜的实现,如何在直播中实现优质的美颜SDK效果
  7. Caporali HSK63A.H80.WE16
  8. matplotlib保存图片去除白边
  9. 黑产以及一般业务安全的应对思路
  10. python批量下载图片