java生成验证码图片的方法

作者:相思子~ 时间:2023-12-09 08:57:15 

本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下

示例一:


import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.util.Random;

public class RandomVerifyCode {

private static final String RANDOM_NUM = "23456789";
 private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";
 private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";
 private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;

private int width = 95;// 图片宽
 private int height = 25;// 图片高
 private int lineSize = 40;// 干扰线数量
 private int stringNum = 4;// 随机产生字符数量

private Random random = new Random();

/**
  * 获得字体
  */
 private Font getFont() {
   return new Font("Fixedsys", Font.CENTER_BASELINE, 18);
 }

/**
  * 获得颜色
  */
 private 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);
 }

/**
  * 生成随机图片(BASE64格式)
  */
 public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {
   // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类
   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
   Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作
   g.fillRect(0, 0, width, height);//图片大小
   g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小
   g.setColor(getRandColor(110, 133));//字体颜色
   // 绘制干扰线
   for (int i = 0; i <= lineSize; i++) {
     drowLine(g);
   }
   // 绘制随机字符
   String randomString = "";
   for (int i = 1; i <= stringNum; i++) {
     randomString = drowString(g, randomString, i);
   }
   g.dispose();
   ByteArrayOutputStream out = new ByteArrayOutputStream();
   String encode = null;
   try {
     // 将内存中的图片通过流动形式输出到客户端
     ImageIO.write(image, "JPEG", out);
     encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());
     out.close();
   } catch (Exception e) {
     LogHelper.error("登陆控制","验证码生成","将内存中生成的验证码图片输出为BASE64格式编码失败!");
   }
   imgBuffer.append(encode);
   return randomString;
 }

/**
  * 绘制字符串
  */
 private String drowString(Graphics g, String randomString, int i) {
   g.setFont(getFont());
   g.setColor(new Color(random.nextInt(101), random.nextInt(111), random
       .nextInt(121)));
   String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));
   randomString += rand;
   g.translate(random.nextInt(3), random.nextInt(3));
   g.drawString(rand, 13 * i, 16);
   return randomString;
 }

/**
  * 绘制干扰线
  */
 private void drowLine(Graphics g) {
   int x = random.nextInt(width);
   int y = random.nextInt(height);
   int xl = random.nextInt(13);
   int yl = random.nextInt(15);
   g.drawLine(x, y, x + xl, y + yl);
 }

/**
  * 获取随机的字符
  */
 public String getRandomString(int num) {
   return String.valueOf(RANDOM_STRING.charAt(num));
 }

public static String randomString(int length){
   return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());
 }
}

示例二:


import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class CodeUtil {

private static int width = 90;// 定义图片的width 90
 private static int height = 20;// 定义图片的height 20
 private static int codeCount = 4;// 定义图片上显示验证码的个数
 private static int xx = 15;
 private static int fontHeight = 18;
 private static int codeY = 16;
 private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',
     'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};

public static Map<String,RenderedImage> codePicMap = new HashMap<>();

/**
  * 生成一个map集合
  * code为生成的验证码
  * codePic为生成的验证码BufferedImage对象
  *
  * @return
  */
 public static Map<String, Object> generateCodeAndPic() {
   // 定义图像buffer
   BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
   // Graphics2D gd = buffImg.createGraphics();
   // Graphics2D gd = (Graphics2D) buffImg.getGraphics();
   Graphics gd = buffImg.getGraphics();
   // 创建一个随机数生成器类
   Random random = new Random();
   // 将图像填充为蓝色
//    gd.setColor(Color.WHITE);
   gd.setColor(new Color(232,240,254));
   gd.fillRect(0, 0, width, height);

// 创建字体,字体的大小应该根据图片的高度来定。
   Font font = new Font("Fixedsys", Font.BOLD, fontHeight);
   // 设置字体。
   gd.setFont(font);

// 画边框。
   gd.setColor(Color.BLACK);
   gd.drawRect(0, 0, width - 1, height - 1);

// 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。
   gd.setColor(Color.BLACK);
   for (int i = 0; i < 10; i++) {
     int x = random.nextInt(width);
     int y = random.nextInt(height);
     int xl = random.nextInt(12);
     int yl = random.nextInt(12);
     gd.drawLine(x, y, x + xl, y + yl);
   }

// randomCode用于保存随机产生的验证码,以便用户登录后进行验证。
   StringBuffer randomCode = new StringBuffer();
   int red = 0, green = 0, blue = 0;

// 随机产生codeCount数字的验证码。
   for (int i = 0; i < codeCount; i++) {
     // 得到随机产生的验证码数字。
     String code = String.valueOf(codeSequence[random.nextInt(31)]);
     // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。
     red = random.nextInt(255);
     green = random.nextInt(255);
     blue = random.nextInt(255);

// 用随机产生的颜色将验证码绘制到图像中。
     gd.setColor(new Color(red, green, blue));
     gd.drawString(code, (i + 1) * xx, codeY);
     // 将产生的四个随机数组合在一起。
     randomCode.append(code);
   }
   Map<String, Object> map = new HashMap<>();
   //存放验证码
   map.put("code", randomCode);
   //存放生成的验证码BufferedImage对象
   map.put("codePic", buffImg);
   return map;
 }

public static void main(String[] args) throws Exception {
   //创建文件输出流对象
   OutputStream out = new FileOutputStream("D://img/" + System.currentTimeMillis() + ".jpg");
   Map<String, Object> map = CodeUtil.generateCodeAndPic();
   ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);
   System.out.println("验证码的值为:" + map.get("code"));
 }
}

来源:https://blog.csdn.net/iloki/article/details/113996064

标签:java,验证码
0
投稿

猜你喜欢

  • springboot如何使用AOP做访问请求日志

    2023-11-11 10:12:19
  • java 汉诺塔Hanoi递归、非递归(仿系统递归)和非递归规律 实现代码

    2023-09-13 11:29:31
  • springboot的yml配置文件通过db2的方式整合mysql的教程

    2023-08-06 04:28:55
  • springboot整合token的实现代码

    2023-11-10 19:02:03
  • java读取文件内容的三种方法代码片断分享(java文件操作)

    2023-11-21 06:53:20
  • JPA Specification常用查询+排序实例

    2023-11-23 04:56:32
  • OpenCV实现直线拟合

    2023-06-22 15:22:37
  • Java常用类String的面试题汇总(java面试题)

    2023-11-23 20:40:45
  • java调用openoffice将office系列文档转换为PDF的示例方法

    2023-11-29 11:42:53
  • Java Collections.shuffle()方法案例详解

    2023-11-24 15:53:16
  • java 中如何实现 List 集合去重

    2023-10-07 07:54:06
  • 分享几个Java工作中实用的代码优化技巧

    2023-11-28 12:04:50
  • Spring Cloud中FeignClient实现文件上传功能

    2023-06-23 07:57:09
  • springboot返回图片流的实现示例

    2023-11-23 17:30:08
  • java创建子类对象设置并调用父类的变量操作

    2023-10-13 18:16:13
  • Android studio中生成引用.aar和.jar的方法详解

    2023-09-29 07:48:33
  • IDEA远程连接HBase及其Java API实战详解

    2023-11-27 21:54:46
  • 关于Springboot中JSCH的使用及说明

    2023-11-28 02:32:16
  • Java8中LocalDateTime与时间戳timestamp的互相转换

    2023-11-10 05:20:21
  • 图解Java线程的生命周期

    2022-04-12 15:16:10
  • asp之家 软件编程 m.aspxhome.com