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
投稿

猜你喜欢

  • C#连接ODBC数据源的方法

    2023-04-20 07:30:33
  • SpringBoot+Vue项目新手快速入门指南

    2023-05-20 04:56:07
  • 简单总结C++中指针常量与常量指针的区别

    2022-06-28 17:33:12
  • 编写Java代码对HDFS进行增删改查操作代码实例

    2023-07-08 11:46:42
  • Java获取用户IP属地模拟抖音详解

    2023-04-18 02:01:29
  • 如何解决springmvc文件下载,内容损坏的问题

    2023-10-11 07:12:10
  • android studio 3.0 service项目背景音乐实现

    2023-07-03 23:34:36
  • Android中3种全屏方法及3种去掉标题栏的方法

    2023-11-07 18:45:51
  • Android编程实现应用强制安装到手机内存的方法

    2023-11-09 14:00:40
  • JavaBean和Map转换封装类的方法

    2023-04-18 06:50:52
  • 23种设计模式(19)java责任链模式

    2021-10-19 15:04:00
  • Android自定义ViewPagerIndicator实现炫酷导航栏指示器(ViewPager+Fragment)

    2021-11-05 13:16:12
  • java程序员如何编写更好的单元测试的7个技巧

    2023-09-05 14:57:24
  • SpringCloud如何解决服务之间的通信问题

    2023-03-27 03:13:05
  • 浅谈C#六大设计原则

    2023-05-02 16:29:58
  • Android之获取手机内部及sdcard存储空间的方法

    2022-11-11 13:10:18
  • Android实现通讯录效果——获取手机号码和姓名

    2021-10-25 11:53:59
  • Springboot内置tomcat配置虚拟路径过程解析

    2021-12-21 06:06:03
  • 浅入浅出的讲解Spring循环依赖问题

    2023-11-03 07:16:11
  • SpringBoot项目依赖和配置最新示例讲解

    2021-08-13 23:04:23
  • asp之家 软件编程 m.aspxhome.com