zoukankan      html  css  js  c++  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) period
    169                                 + (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) period
    191                                 + (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 }
  • 相关阅读:
    ArrayList用法
    MessageBox
    将文本文件导入Sql数据库
    在桌面和菜单中添加快捷方式
    泡沫排序
    Making use of localized variables in javascript.
    Remove double empty lines in Visual Studio 2012
    Using Operations Manager Connectors
    Clear SharePoint Designer cache
    Programmatically set navigation settings in SharePoint 2013
  • 原文地址:https://www.cnblogs.com/feiyun126/p/4081254.html
Copyright © 2011-2022 走看看