圖片驗證碼的JAVA工具類

咱們平時開發時常常會遇到須要圖片驗證碼,基礎的驗證碼包括了數字、字母、甚至可能有漢字。下面我給出一個簡單的工具類。java

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

點我啦!贈送大疆無人機app

相關文章
相關標籤/搜索