成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

圖片驗證碼的JAVA工具類

SKYZACK / 681人閱讀

摘要:我們平時開發(fā)時經(jīng)常會遇到需要圖片驗證碼,基礎的驗證碼包括了數(shù)字字母甚至可能有漢字。下面我給出一個簡單的工具類。驗證碼生成器圖片的寬度。

我們平時開發(fā)時經(jīng)常會遇到需要圖片驗證碼,基礎的驗證碼包括了數(shù)字、字母、甚至可能有漢字。下面我給出一個簡單的工具類。

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;
    // 驗證碼字符個數(shù)
    private int codeCount = 5;
    // 驗證碼干擾線數(shù)
    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
     *            字符個數(shù)
     * @param lineCount
     *            干擾線條數(shù)
     */
    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();
        // 生成隨機數(shù)
        Random random = new Random();
        // 將圖像填充為白色
        g.setColor(Color.WHITE);
        g.fillRect(0, 0, width, height);
        // 創(chuàng)建字體
        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記錄隨機產(chǎn)生的驗證碼
        StringBuffer randomCode = new StringBuffer();
        // 隨機產(chǎn)生codeCount個字符的驗證碼。
        for (int i = 0; i < codeCount; i++) {
            String strRand = String.valueOf(codeSequence[random.nextInt(codeSequence.length)]);
            // 產(chǎn)生隨機的顏色值,讓輸出的每個字符的顏色值都將不同。
            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);
            // 將產(chǎn)生的四個隨機數(shù)組合在一起。
            randomCode.append(strRand);
        }
        // 將四位數(shù)字的驗證碼保存到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;  
     }  
}

點我啦!贈送大疆無人機

文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64991.html

相關文章

  • Java虛擬機:Java二進制字節(jié)碼的結(jié)構(gòu)、加載

    摘要:這個龐大的結(jié)構(gòu)主要包含以下幾個部分魔數(shù)和版本號基本的信息用于確定二進制字節(jié)碼的特征和加載可行特征。 這篇文章的素材來自周志明的《深入理解Java虛擬機》。 作為Java開發(fā)人員,一定程度了解JVM虛擬機的的運作方式非常重要,本文就一些簡單的虛擬機的相關概念和運作機制展開我自己的學習過程,是這個系列的第二篇。 我們在文件里寫入了java的源代碼,源代碼寫就后存入磁盤,磁盤上的源代碼經(jīng)過j...

    CHENGKANG 評論0 收藏0
  • ThinkPHP驗證碼不顯示的解決方案

    摘要:今天遇到一個很奇怪的,就是我寫了一個程序本地運行正常,但是發(fā)布到甲方的服務器上出現(xiàn)無法顯示驗證碼的。適用于驗證碼圖片在新窗口打開的時候顯示了報錯信息以及一堆亂碼的情況下,如果有報錯信息,請根據(jù)報錯信息進行檢查驗證碼所調(diào)用的字體是否缺失。 今天遇到一個很奇怪的BUG,就是我寫了一個PHP程序本地運行正常,但是發(fā)布到甲方的服務器上出現(xiàn)無法顯示驗證碼的BUG。 showImg(https:/...

    Meils 評論0 收藏0
  • node識別驗證

    摘要:驗證碼的識別成功率跟圖片質(zhì)量關系密切,一般拿到后的驗證碼都得經(jīng)過灰度化,二值化,去噪,利用就可以很方便的做到。 了解驗證碼 什么是驗證碼? 所謂驗證碼,就是將一串隨機產(chǎn)生的數(shù)字或符號,生成一幅圖片,圖片里加上一些干擾象素(防止OCR),由用戶肉眼識別其中的驗證碼信息,輸入表單提交網(wǎng)站驗證,驗證成功后才能使用某項功能,通俗說就是一種區(qū)分用戶是計算機和人的公共全自動程序 驗證碼的作用 可以...

    levy9527 評論0 收藏0
  • 15分鐘破解網(wǎng)站驗證

    摘要:目前花費了兩分鐘。我這地方使用卷積神經(jīng)網(wǎng)絡,。這地方對卷積神經(jīng)網(wǎng)絡算法就不做詳細介紹,感興趣的同學,可以學習一下。 概述 ??很多開發(fā)者都討厭網(wǎng)站的驗證碼,特別是寫網(wǎng)絡爬蟲的程序員,而網(wǎng)站之所以設置驗證碼,是為了防止機器人訪問網(wǎng)站,造成不必要的損失?,F(xiàn)在好了,隨著機器學習技術的發(fā)展,機器識別驗證碼的問題比較好解決了。 樣本采集工具 ??這里我們采用wordpress的Really Si...

    hlcfan 評論0 收藏0

發(fā)表評論

0條評論

SKYZACK

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<