博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片验证码的JAVA工具类
阅读量:7121 次
发布时间:2019-06-28

本文共 5637 字,大约阅读时间需要 18 分钟。

hot3.png

我们平时开发时经常会遇到需要图片验证码,基础的验证码包括了数字、字母、甚至可能有汉字。下面我给出一个简单的工具类。

package com..ankang.tony.util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStream;import java.util.Date;import java.util.Random;import javax.imageio.ImageIO;/** * 验证码生成器 */public class ValidateCode {    // 图片的宽度。    private int width = 160;    // 图片的高度。    private int height = 40;    // 验证码字符个数    private int codeCount = 5;    // 验证码干扰线数    private int lineCount = 150;    // 验证码    private static String code = null;    // 验证码图片Buffer    private BufferedImage buffImg = null;    private char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R',            'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9' };    public ValidateCode() {        this.createCode();    }    /**     *      * @param width     *            图片宽     * @param height     *            图片高     */    public ValidateCode(int width, int height) {        this.width = width;        this.height = height;        this.createCode();    }    /**     *      * @param width     *            图片宽     * @param height     *            图片高     * @param codeCount     *            字符个数     * @param lineCount     *            干扰线条数     */    public ValidateCode(int width, int height, int codeCount, int lineCount) {        this.width = width;        this.height = height;        this.codeCount = codeCount;        this.lineCount = lineCount;        this.createCode();    }    public void createCode() {        int x = 0, fontHeight = 0, codeY = 0;        int red = 0, green = 0, blue = 0;        x = width / (codeCount + 1);// 每个字符的宽度        fontHeight = height - 2;// 字体的高度        codeY = height - 3;        // 图像buffer        buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);        Graphics2D g = buffImg.createGraphics();        // 生成随机数        Random random = new Random();        // 将图像填充为白色        g.setColor(Color.WHITE);        g.fillRect(0, 0, width, height);        // 创建字体        ImgFontByte imgFont = new ImgFontByte();        Font font = imgFont.getFont(fontHeight);        g.setFont(font);        for (int i = 0; i < lineCount; i++) {            int xs = random.nextInt(width);            int ys = random.nextInt(height);            int xe = xs + random.nextInt(width / 8);            int ye = ys + random.nextInt(height / 8);            red = random.nextInt(255);            green = random.nextInt(255);            blue = random.nextInt(255);            g.setColor(new Color(red, green, blue));            g.drawLine(xs, ys, xe, ye);        }        // randomCode记录随机产生的验证码        StringBuffer randomCode = new StringBuffer();        // 随机产生codeCount个字符的验证码。        for (int i = 0; i < codeCount; i++) {            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);            // 产生随机的颜色值,让输出的每个字符的颜色值都将不同。            red = random.nextInt(255);            green = random.nextInt(255);            blue = random.nextInt(255);            g.setColor(new Color(red, green, blue));            g.drawString(strRand, (i + 1) * x, codeY);            // 将产生的四个随机数组合在一起。            randomCode.append(strRand);        }        // 将四位数字的验证码保存到Session中。        code = randomCode.toString();    }    public void write(String path,String fileName) throws IOException {        File folder = new File(path);        if(!folder.exists()){            folder.mkdirs();        }        OutputStream sos = new FileOutputStream(path+fileName);        this.write(sos);    }    public void write(OutputStream sos) throws IOException {        ImageIO.write(buffImg, "png", sos);        sos.close();    }    public BufferedImage getBuffImg() {        return buffImg;    }    public String getCode() {        return code;    }        public static void main(String[] args) {          ValidateCode vCode = new ValidateCode(120,40,5,50);          try {              String path="D:\\report\\image\\code\\";              System.out.println(vCode.getCode()+" >"+path);              vCode.write(path,new Date().getTime()+".png");          } catch (IOException e) {              e.printStackTrace();        }       }}

下面这个类主要是用作字体的设置,大家也可以直接拿过来用。

package com.ankang.tony.util;import java.awt.Font;import java.io.ByteArrayInputStream;public class ImgFontByte {     public Font getFont(int fontHeight){              try {                  Font baseFont = Font.createFont(Font.ITALIC, new ByteArrayInputStream(hex2byte(getFontByteStr())));                 return baseFont.deriveFont(Font.PLAIN, fontHeight);              } catch (Exception e) {                  return new Font("Consola",Font.PLAIN, fontHeight);              }          }                    private  byte[] hex2byte(String str) {               if (str == null)                  return null;              str = str.trim();              int len = str.length();              if (len == 0 || len % 2 == 1)                  return null;              byte[] b = new byte[len / 2];              try {                  for (int i = 0; i < str.length(); i += 2) {                      b[i/2] = (byte) Integer.decode("0x" + str.substring(i, i + 2)).intValue();                  }                  return b;              } catch (Exception e) {                  return null;              }          }              /**       * ttf字体文件的十六进制字符串       * @return       */       private String getFontByteStr(){          return null;       }  }

转载于:https://my.oschina.net/zhangjie5201314/blog/775884

你可能感兴趣的文章
Create superuser in Django
查看>>
Mysql主从复制配置
查看>>
rsync服务器
查看>>
使用Hexo+Github一步步搭建属于自己的博客(基础)
查看>>
数据库优化资料整理
查看>>
tomcat 原理与使用资料
查看>>
报此错错解决办法:java.lang.NoSuchMethodError: javax.persistence.OneToMany.orphanRemoval()Z
查看>>
c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
查看>>
旅游网站进行邮件订阅的七大步骤讲解
查看>>
shell基础
查看>>
linux 文件类型 时间戳 ls bash特性四 文件查看命令 cp move echo
查看>>
如何在XenDesktop中映射USB设备
查看>>
Java并发编程 基础知识学习总结
查看>>
我又发现一个直接就能安装中文小红帽的方法
查看>>
ACM弱校ACMer A HDU1045Fire Net有感
查看>>
cxgrid实现分组统计和添加Footer
查看>>
刘敏华:2013年网络营销行业展望
查看>>
理解MySQL——架构与概念
查看>>
vsftpd虚拟用户
查看>>
ionic 幻灯指令 ion-slide-box
查看>>