摘要:我們平時開發(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
摘要:這個龐大的結(jié)構(gòu)主要包含以下幾個部分魔數(shù)和版本號基本的信息用于確定二進制字節(jié)碼的特征和加載可行特征。 這篇文章的素材來自周志明的《深入理解Java虛擬機》。 作為Java開發(fā)人員,一定程度了解JVM虛擬機的的運作方式非常重要,本文就一些簡單的虛擬機的相關概念和運作機制展開我自己的學習過程,是這個系列的第二篇。 我們在文件里寫入了java的源代碼,源代碼寫就后存入磁盤,磁盤上的源代碼經(jīng)過j...
摘要:今天遇到一個很奇怪的,就是我寫了一個程序本地運行正常,但是發(fā)布到甲方的服務器上出現(xiàn)無法顯示驗證碼的。適用于驗證碼圖片在新窗口打開的時候顯示了報錯信息以及一堆亂碼的情況下,如果有報錯信息,請根據(jù)報錯信息進行檢查驗證碼所調(diào)用的字體是否缺失。 今天遇到一個很奇怪的BUG,就是我寫了一個PHP程序本地運行正常,但是發(fā)布到甲方的服務器上出現(xiàn)無法顯示驗證碼的BUG。 showImg(https:/...
摘要:目前花費了兩分鐘。我這地方使用卷積神經(jīng)網(wǎng)絡,。這地方對卷積神經(jīng)網(wǎng)絡算法就不做詳細介紹,感興趣的同學,可以學習一下。 概述 ??很多開發(fā)者都討厭網(wǎng)站的驗證碼,特別是寫網(wǎng)絡爬蟲的程序員,而網(wǎng)站之所以設置驗證碼,是為了防止機器人訪問網(wǎng)站,造成不必要的損失?,F(xiàn)在好了,隨著機器學習技術的發(fā)展,機器識別驗證碼的問題比較好解決了。 樣本采集工具 ??這里我們采用wordpress的Really Si...
閱讀 3469·2019-08-30 13:15
閱讀 1405·2019-08-29 18:34
閱讀 832·2019-08-29 15:18
閱讀 3490·2019-08-29 11:21
閱讀 3252·2019-08-29 10:55
閱讀 3707·2019-08-26 10:36
閱讀 1875·2019-08-23 18:37
閱讀 1832·2019-08-23 16:57