用画布的方式实现验证码

Posted dabu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用画布的方式实现验证码相关的知识,希望对你有一定的参考价值。

  1 //用画布做一个验证码
  2 @WebServlet("/image.do")
  3 public class ImageCodeServlet extends HttpServlet {
  4     private static final long serialVersionUID = 1L;
  5     
  6     //设置画布的长宽以及验证码的字的个数
  7     static int width=100;
  8     static int height=40;
  9     static int size=4;
 10     
 11     static Random random=new Random();
 12     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 13 
 14         //1 获取一个人画布
 15         /**
 16          * BufferedImage.TYPE_INT_RGB 画布的三原色
 17          */
 18         BufferedImage bi=new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB );
 19     
 20         //2 获取画笔
 21         Graphics graphics=bi.getGraphics();
 22         
 23         //3 给画笔设置一个颜色
 24         graphics.setColor(getColor());
 25     
 26         //4 作画
 27         //4.1 画框 长宽;给画布填充一个背景色
 28         //画一个长方形 坐标从0-0开始
 29         graphics.fillRect(0, 0, width, height);
 30         
 31         //4.2 往框里面写字 写之前设置好的size次
 32         //设置会出现的字体
 33         String str="qwertyuidhjcnx12345689AGDFCZMW";
 34         char[]ch=str.toCharArray();
 35         StringBuilder sb=new StringBuilder();
 36         
 37         for (int i = 0; i < size; i++) {
 38             graphics.setColor(getFontColor());
 39             
 40             //写字的时候,Y坐标的位置:10-40 x坐标从5开始到95结束
 41             
 42             int index=random.nextInt(ch.length);
 43             
 44             graphics.drawString(ch[index]+"", i*15+random.nextInt(10), random.nextInt(25)+15);
 45         
 46             sb.append(ch[index]);
 47         }
 48         
 49         //4.3 添加干扰
 50         //添加点干扰
 51         for (int i = 0; i < 300; i++) {
 52             
 53             graphics.setColor(getColor());
 54             graphics.drawOval(random.nextInt(width), random.nextInt(height), 1, 1);
 55         }
 56         
 57         //添加线干扰
 58         graphics.setColor(getColor());
 59         graphics.clearRect(random.nextInt(width), random.nextInt(height), random.nextInt(50), 1);
 60         
 61         //把验证码的字符存储起来
 62         request.getSession().setAttribute("code",sb.toString());
 63         
 64         //5 将画好的图片,使用流输出到前台
 65         //将bi这个画笔以png的格式输出到前台
 66         ImageIO.write(bi,"png",response.getOutputStream());
 67         
 68     }
 69 
 70     //获取一个颜色对象,背景用浅色,文字用深色
 71     private Color getColor(){
 72         
 73         int x;
 74         int y;
 75         int z;
 76         
 77         do {
 78             x=random.nextInt(250);
 79             y=random.nextInt(250);
 80             z=random.nextInt(250);
 81         } while (!isDark(x, y, y));
 82         
 83         return new Color(x,y,z);
 84     }
 85     
 86     //字体用深色
 87         private Color getFontColor(){
 88             
 89             int x;
 90             int y;
 91             int z;
 92             
 93             do {
 94                 x=random.nextInt(250);
 95                 y=random.nextInt(250);
 96                 z=random.nextInt(250);
 97             } while (isDark(x, y, y));
 98             
 99             return new Color(x,y,z);
100         }
101     
102     
103     /**
104      * 根据RGB值判断 深色与浅色
105      * @param r
106      * @param g
107      * @param b
108      * @return
109      */
110     private boolean isDark(int r,int g,int b){
111         if(r*0.299d + g*0.578d + b*0.114d >= 192){ //浅色
112             return false;
113         }else{  //深色
114             return true;
115         }
116     }
117 
118     
119     
120     
121     
122     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
123         // TODO Auto-generated method stub
124         doGet(request, response);
125     }

技术图片

 

以上是关于用画布的方式实现验证码的主要内容,如果未能解决你的问题,请参考以下文章

画布实现验证码

画布实现随机验证码

Django中验证码的实现

验证码的实现

PHP实现验证码

验证码画布生成以及点击图片切换验证码