首页 > 代码库 > java 超经漂亮验证码

java 超经漂亮验证码

  1 package com.zly.xsp.image;  2   3 import java.awt.Color;  4 import java.awt.Font;  5 import java.awt.Graphics;  6 import java.awt.Graphics2D;  7 import java.awt.image.BufferedImage;  8 import java.io.IOException;  9 import java.io.OutputStream; 10 import java.util.Random; 11  12 import javax.imageio.ImageIO; 13 import javax.servlet.http.HttpServletRequest; 14 import javax.servlet.http.HttpServletResponse; 15 import javax.servlet.http.HttpSession; 16  17 public class CreateImageCode { 18     // 图片的宽度。 19     private int width = 160; 20     // 图片的高度。 21     private int height = 40; 22     // 验证码字符个数 23     private int codeCount = 4; 24     // 验证码干扰线数 25     private int lineCount = 20; 26     // 验证码 27     private String code = null; 28     // 验证码图片Buffer 29     private BufferedImage buffImg = null; 30     Random random = new Random(); 31  32     public CreateImageCode() { 33         creatImage(); 34     } 35  36     public CreateImageCode(int width, int height) { 37         this.width = width; 38         this.height = height; 39         creatImage(); 40     } 41  42     public CreateImageCode(int width, int height, int codeCount) { 43         this.width = width; 44         this.height = height; 45         this.codeCount = codeCount; 46         creatImage(); 47     } 48  49     public CreateImageCode(int width, int height, int codeCount, int lineCount) { 50         this.width = width; 51         this.height = height; 52         this.codeCount = codeCount; 53         this.lineCount = lineCount; 54         creatImage(); 55     } 56  57     // 生成图片 58     private void creatImage() { 59         int fontWidth = width / codeCount;// 字体的宽度 60         int fontHeight = height - 5;// 字体的高度 61         int codeY = height - 8; 62  63         // 图像buffer 64         buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 65         Graphics g = buffImg.getGraphics(); 66         //Graphics2D g = buffImg.createGraphics(); 67         // 设置背景色 68         g.setColor(getRandColor(200, 250)); 69         g.fillRect(0, 0, width, height); 70          71          72          73         // 设置字体 74         //Font font1 = getFont(fontHeight); 75         Font font = new Font("Fixedsys", Font.BOLD, fontHeight); 76         g.setFont(font); 77  78         // 设置干扰线 79         for (int i = 0; i < lineCount; i++) { 80             int xs = random.nextInt(width); 81             int ys = random.nextInt(height); 82             int xe = xs + random.nextInt(width); 83             int ye = ys + random.nextInt(height); 84             g.setColor(getRandColor(1, 255)); 85             g.drawLine(xs, ys, xe, ye); 86         } 87  88         // 添加噪点 89         float yawpRate = 0.01f;// 噪声率 90         int area = (int) (yawpRate * width * height); 91         for (int i = 0; i < area; i++) { 92             int x = random.nextInt(width); 93             int y = random.nextInt(height); 94  95             buffImg.setRGB(x, y, random.nextInt(255)); 96         } 97  98  99         String str1 = randomStr(codeCount);// 得到随机字符100         this.code = str1;101         for (int i = 0; i < codeCount; i++) {102             String strRand = str1.substring(i, i + 1);103             g.setColor(getRandColor(1, 255));104             // g.drawString(a,x,y);105             // a为要画出来的东西,x和y表示要画的东西最左侧字符的基线位于此图形上下文坐标系的 (x, y) 位置处106             107             g.drawString(strRand, i*fontWidth+3, codeY);108         }109         110 111     }112 113     // 得到随机字符114     private String randomStr(int n) {115         String str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";116         String str2 = "";117         int len = str1.length() - 1;118         double r;119         for (int i = 0; i < n; i++) {120             r = (Math.random()) * len;121             str2 = str2 + str1.charAt((int) r);122         }123         return str2;124     }125 126     // 得到随机颜色127     private Color getRandColor(int fc, int bc) {// 给定范围获得随机颜色128         if (fc > 255)129             fc = 255;130         if (bc > 255)131             bc = 255;132         int r = fc + random.nextInt(bc - fc);133         int g = fc + random.nextInt(bc - fc);134         int b = fc + random.nextInt(bc - fc);135         return new Color(r, g, b);136     }137     138     /**139      * 产生随机字体140      */141     private Font getFont(int size) {142         Random random = new Random();143         Font font[] = new Font[5];144         font[0] = new Font("Ravie", Font.PLAIN, size);145         font[1] = new Font("Antique Olive Compact", Font.PLAIN, size);146         font[2] = new Font("Fixedsys", Font.PLAIN, size);147         font[3] = new Font("Wide Latin", Font.PLAIN, size);148         font[4] = new Font("Gill Sans Ultra Bold", Font.PLAIN, size);149         return font[random.nextInt(5)];150     }151     152     // 扭曲方法153         private void shear(Graphics g, int w1, int h1, Color color) {154             shearX(g, w1, h1, color);155             shearY(g, w1, h1, color);156         }157 158         private void shearX(Graphics g, int w1, int h1, Color color) {159 160             int period = random.nextInt(2);161 162             boolean borderGap = true;163             int frames = 1;164             int phase = random.nextInt(2);165 166             for (int i = 0; i < h1; i++) {167                 double d = (double) (period >> 1)168                         * Math.sin((double) i / (double) period169                                 + (6.2831853071795862D * (double) phase)170                                 / (double) frames);171                 g.copyArea(0, i, w1, 1, (int) d, 0);172                 if (borderGap) {173                     g.setColor(color);174                     g.drawLine((int) d, i, 0, i);175                     g.drawLine((int) d + w1, i, w1, i);176                 }177             }178 179         }180 181         private void shearY(Graphics g, int w1, int h1, Color color) {182 183             int period = random.nextInt(40) + 10; // 50;184 185             boolean borderGap = true;186             int frames = 20;187             int phase = 7;188             for (int i = 0; i < w1; i++) {189                 double d = (double) (period >> 1)190                         * Math.sin((double) i / (double) period191                                 + (6.2831853071795862D * (double) phase)192                                 / (double) frames);193                 g.copyArea(i, 0, 1, h1, 0, (int) d);194                 if (borderGap) {195                     g.setColor(color);196                     g.drawLine(i, (int) d, i, 0);197                     g.drawLine(i, (int) d + h1, i, h1);198                 }199 200             }201 202         }203 204 205     206     public void write(OutputStream sos) throws IOException {207         ImageIO.write(buffImg, "png", sos);208         sos.close();209     }210 211     public BufferedImage getBuffImg() {212         return buffImg;213     }214 215     public String getCode() {216         return code.toLowerCase();217     }218     219     //使用方法220  /*public void getCode3(HttpServletRequest req, HttpServletResponse response,HttpSession session) throws IOException{221         // 设置响应的类型格式为图片格式222             response.setContentType("image/jpeg");223             //禁止图像缓存。224             response.setHeader("Pragma", "no-cache");225             response.setHeader("Cache-Control", "no-cache");226             response.setDateHeader("Expires", 0);227             228             229             CreateImageCode vCode = new CreateImageCode(100,30,5,10);230             session.setAttribute("code", vCode.getCode());231             vCode.write(response.getOutputStream());232      }*/233 234 }

 

java 超经漂亮验证码