package cn.net.seek.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.OutputStream; import java.util.Random; import javax.imageio.ImageIO; public class ImgZoom { // 驗證碼圖片中能夠出現的字符集,可根據須要修改 private char mapTable[] = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' }; /** * 生成驗證碼 * @param width 寬度 60 * @param height 高度 24 * @param os 輸出流 * @return 生成的隨機字符串 */ public String getCertPic(int width, int height, OutputStream os) { BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); // 獲取圖形上下文 Graphics g = image.getGraphics(); // 生成隨機類 Random random = new Random(); // 設定背景色 // g.setColor(getRandColor(200, 250)); //隨機生成背景色 g.setColor(new Color(255, 255, 255)); g.fillRect(0, 0, width, height); // 設定字體 g.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 隨機產生155條幹擾線,使圖象中的認證碼不易被其它程序探測到 g.setColor(getRandColor(160, 200)); for (int i = 0; i < 155; i++) { int x = random.nextInt(width); int y = random.nextInt(height); int xl = random.nextInt(12); int yl = random.nextInt(12); g.drawLine(x, y, x + xl, y + yl); } // 取隨機產生的認證碼(5位) String sRand = ""; for (int i = 0; i < 5; i++) { String rand = mapTable[(int) (mapTable.length * Math.random())] + ""; sRand += rand; // 將認證碼顯示到圖象中 g.setColor(new Color(20 + random.nextInt(110), 20 + random .nextInt(110), 20 + random.nextInt(110)));// 調用函數出來的顏色相同,多是由於種子太接近,因此只能直接生成 g.drawString(rand, 10 * i + 3, (int) (Math.random() * 9 + 14));// 14-23 Math.round(Math.random()*(Max-Min)+Min) } // 釋放圖形上下文 g.dispose(); try { // 輸出圖象到頁面 ImageIO.write(image, "JPEG", os); } catch (IOException e) { return ""; } return sRand; } Color getRandColor(int fc, int bc) { // 給定範圍得到隨機顏色 Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } }