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