资讯专栏INFORMATION COLUMN

图片验证码的JAVA工具类

SKYZACK / 519人阅读

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

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

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:
eportimagecode";  
            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://www.ucloud.cn/yun/64991.html

相关文章

  • Java虚拟机:Java二进制字节码的结构、加载

    摘要:这个庞大的结构主要包含以下几个部分魔数和版本号基本的信息用于确定二进制字节码的特征和加载可行特征。 这篇文章的素材来自周志明的《深入理解Java虚拟机》。 作为Java开发人员,一定程度了解JVM虚拟机的的运作方式非常重要,本文就一些简单的虚拟机的相关概念和运作机制展开我自己的学习过程,是这个系列的第二篇。 我们在文件里写入了java的源代码,源代码写就后存入磁盘,磁盘上的源代码经过j...

    CHENGKANG 评论0 收藏0
  • ThinkPHP验证码不显示的解决方案

    摘要:今天遇到一个很奇怪的,就是我写了一个程序本地运行正常,但是发布到甲方的服务器上出现无法显示验证码的。适用于验证码图片在新窗口打开的时候显示了报错信息以及一堆乱码的情况下,如果有报错信息,请根据报错信息进行检查验证码所调用的字体是否缺失。 今天遇到一个很奇怪的BUG,就是我写了一个PHP程序本地运行正常,但是发布到甲方的服务器上出现无法显示验证码的BUG。 showImg(https:/...

    Meils 评论0 收藏0
  • node识别验证

    摘要:验证码的识别成功率跟图片质量关系密切,一般拿到后的验证码都得经过灰度化,二值化,去噪,利用就可以很方便的做到。 了解验证码 什么是验证码? 所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能,通俗说就是一种区分用户是计算机和人的公共全自动程序 验证码的作用 可以...

    levy9527 评论0 收藏0
  • 15分钟破解网站验证

    摘要:目前花费了两分钟。我这地方使用卷积神经网络,。这地方对卷积神经网络算法就不做详细介绍,感兴趣的同学,可以学习一下。 概述   很多开发者都讨厌网站的验证码,特别是写网络爬虫的程序员,而网站之所以设置验证码,是为了防止机器人访问网站,造成不必要的损失。现在好了,随着机器学习技术的发展,机器识别验证码的问题比较好解决了。 样本采集工具   这里我们采用wordpress的Really Si...

    hlcfan 评论0 收藏0

发表评论

0条评论

SKYZACK

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<