热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

java生成验证码图片的方法

这篇文章主要为大家详细介绍了java生成验证码图片的方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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 codePicMap = new HashMap<>();

  /**
   * 生成一个map集合
   * code为生成的验证码
   * codePic为生成的验证码BufferedImage对象
   *
   * @return
   */
  public static Map 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  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 map = CodeUtil.generateCodeAndPic();
    ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);
    System.out.println("验证码的值为:" + map.get("code"));
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 搭建个人博客:WordPress安装详解
    计划建立个人博客来分享生活与工作的见解和经验,选择WordPress是因为它专为博客设计,功能强大且易于使用。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • Tomcat SSL 配置指南
    本文详细介绍了如何在 Tomcat 中配置 SSL,以确保 Web 应用的安全性。通过正确的配置,可以启用 HTTPS 协议并保护数据传输的安全。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 本文详细介绍了Linux系统中信号量的相关函数,包括sem_init、sem_wait、sem_post和sem_destroy,解释了它们的功能和使用方法,并提供了示例代码。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 本文介绍了.hbs文件作为Ember.js项目中的视图层,类似于HTML文件的功能,并详细讲解了如何在Ember.js应用中集成Bootstrap框架及其相关组件的方法。 ... [详细]
  • 3D打印与延时摄影的创意融合
    本文探讨了如何将3D打印技术与延时摄影技术相结合,创造出令人惊叹的视觉效果。通过详细介绍实现这一创意的过程,包括环境搭建、设备安装及软件设置等关键步骤。 ... [详细]
  • 本文提供了 Oracle 12c 数据库的官方下载链接,并附带了安装前的一些准备工作和注意事项。 ... [详细]
  • 使用Root权限执行命令时遇到的问题及解决方案
    本文讨论了在Linux系统中使用特定插件(如fastestmirror和langpacks)时,若非root用户尝试执行某些命令可能遇到的权限问题,并提供了相应的解决方法。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
author-avatar
粉红涩色
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有