温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用java如何生成一个验证码图片

发布时间:2021-02-25 14:27:34 来源:亿速云 阅读:210 作者:戴恩恩 栏目:开发技术

本文章向大家介绍使用java如何生成一个验证码图片的基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

Java的特点有哪些

Java的特点有哪些 1.Java语言作为静态面向对象编程语言的代表,实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。 2.Java具有简单性、面向对象、分布式、安全性、平台独立与可移植性、动态性等特点。 3.使用Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

示例一:

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"));   } }

以上就是小编为大家带来的使用java如何生成一个验证码图片的全部内容了,希望大家多多支持亿速云!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI