java实现验证码图片

  1 package sip.utils;
  2 import java.awt.Color;
  3 import java.awt.Graphics2D;
  4 import java.awt.geom.AffineTransform;
  5 import java.util.Random;
  6
  7 /**
  8  * 验证码图片生成器
  9  *
 10  * @author WuZhengFei
 11  *
 12  */
 13 public class IdentityCode {
 14     /**
 15      * 验证码图片的宽度。
 16      */
 17     private int width = 80;
 18     /**
 19      * 验证码图片的高度。
 20      */
 21     private int height = 23;
 22     /**
 23      * 验证码的数量。
 24      */
 25     private Random random = new Random();
 26
 27     public IdentityCode(){}
 28     /**
 29      * 生成随机颜色
 30      * @param fc    前景色
 31      * @param bc    背景色
 32      * @return  Color对象,此Color对象是RGB形式的。
 33      */
 34     public Color getRandomColor(int fc, int bc) {
 35         if (fc > 255)
 36             fc = 200;
 37         if (bc > 255)
 38             bc = 255;
 39         int r = fc + random.nextInt(bc - fc);
 40         int g = fc + random.nextInt(bc - fc);
 41         int b = fc + random.nextInt(bc - fc);
 42         return new Color(r, g, b);
 43     }
 44
 45     /**
 46      * 绘制干扰线
 47      * @param g Graphics2D对象,用来绘制图像
 48      * @param nums  干扰线的条数
 49      */
 50     public void drawRandomLines(Graphics2D g ,int nums ){
 51         g.setColor(this.getRandomColor(160, 200)) ;
 52         for(int i=0 ; i<nums ; i++){
 53             int x1 = random.nextInt(width) ;
 54             int y1 = random.nextInt(height);
 55             int x2 = random.nextInt(12) ;
 56             int y2 = random.nextInt(12) ;
 57             g.drawLine(x1, y1, x2, y2) ;
 58         }
 59     }
 60
 61     /**
 62      * 获取随机字符串,
 63      *      此函数可以产生由大小写字母,汉字,数字组成的字符串
 64      * @param length    随机字符串的长度
 65      * @return  随机字符串
 66      */
 67     public String drawRandomString(int length , Graphics2D g){
 68         StringBuffer strbuf = new StringBuffer() ;
 69         String temp = "" ;
 70        // int itmp = 0 ;
 71         for(int i=0 ; i<length ; i++){
 72             temp = random.nextInt(length)+"";
 73             /*switch(random.nextInt(5)){
 74             case 1:     //生成A~Z的字母
 75                 itmp = random.nextInt(26) + 65 ;
 76                 temp = String.valueOf((char)itmp);
 77                 break;
 78             case 2:
 79                 itmp = random.nextInt(26) + 97 ;
 80                 temp = String.valueOf((char)itmp);
 81             case 3:     //生成汉字
 82                 String[] rBase = {"0" , "1" , "2" , "3" , "4" , "5" , "6" , "7" ,
 83                         "8" , "9" , "a" , "b" , "c" , "d" , "e" , "f" };
 84                 int r1 = random.nextInt(3)+11 ;     //生成第1位的区码
 85                 String strR1 = rBase[r1] ;      //生成11~14的随机数
 86                 int r2 ;        //生成第2位的区码
 87                 if(r1 == 13)
 88                     r2 = random.nextInt(7) ;    //生成0~7的随机数
 89                 else
 90                     r2 = random.nextInt(16) ;   //生成0~16的随机数
 91                 String strR2 = rBase[r2] ;
 92                 int r3 = random.nextInt(6) + 10 ;   //生成第1位的位码
 93                 String strR3 = rBase[r3] ;
 94                 int r4 ;        //生成第2位的位码
 95                 if(r3 == 10)
 96                     r4 = random.nextInt(15) + 1;    //生成1~16的随机数
 97                 else if(r3 == 15)
 98                     r4 = random.nextInt(15) ;       //生成0~15的随机数
 99                 else
100                     r4 = random.nextInt(16) ;       //生成0~16的随机数
101                 String strR4 = rBase[r4] ;
102                 //将生成的机内码转换成数字
103                 byte[] bytes = new byte[2]   ;
104                 String strR12 = strR1 + strR2 ;     //将生成的区码保存到字节数组的第1个元素中
105                 int tempLow = Integer.parseInt(strR12, 16) ;
106                 bytes[0] = (byte)tempLow;
107                 String strR34 = strR3 + strR4 ;     //将生成的区码保存到字节数组的第2个元素中
108                 int tempHigh = Integer.parseInt(strR34, 16) ;
109                 bytes[1] = (byte)tempHigh;
110                 temp = new String(bytes);           //根据字节数组生成汉字
111                 break;
112             default:
113                 itmp = random.nextInt(10) + 48 ;
114                 temp = String.valueOf((char)itmp) ;
115                 break;
116             } */
117             Color color = new Color(20+random.nextInt(20) , 20+random.nextInt(20) ,20+random.nextInt(20) );
118             g.setColor(color) ;
119             //想文字旋转一定的角度
120             AffineTransform trans = new AffineTransform();
121             trans.rotate(random.nextInt(45)*3.14/180, 15*i+8, 7) ;
122             //缩放文字
123             float scaleSize = random.nextFloat() + 0.8f ;
124             if(scaleSize>1f)
125                 scaleSize = 1f ;
126             trans.scale(scaleSize, scaleSize) ;
127             g.setTransform(trans) ;
128             g.drawString(temp, 15*i+18, 14) ;
129
130             strbuf.append(temp) ;
131         }
132         g.dispose() ;
133         return strbuf.toString() ;
134     }
135     public int getWidth() {
136         return width;
137     }
138     public void setWidth(int width) {
139         this.width = width;
140     }
141     public int getHeight() {
142         return height;
143     }
144     public void setHeight(int height) {
145         this.height = height;
146     }
147     public static void main(String[] arg){
148             //生成验证码
149             //设置不缓存图片
150             response.setHeader("Pragma", "No-cache");
151             response.setHeader("Cache-Control", "No-cache");
152             response.setDateHeader("Expires", 0) ;
153             //指定生成的相应图片
154             response.setContentType("image/jpeg") ;
155             IdentityCode idCode = new IdentityCode();
156             BufferedImage image =new BufferedImage(idCode.getWidth() , idCode.getHeight() , BufferedImage.TYPE_INT_BGR) ;
157             Graphics2D g = image.createGraphics() ;
158             //定义字体样式
159             Font myFont = new Font("黑体" , Font.BOLD , 16) ;
160             //设置字体
161             g.setFont(myFont) ;
162
163             g.setColor(idCode.getRandomColor(200 , 250)) ;
164             //绘制背景
165             g.fillRect(0, 0, idCode.getWidth() , idCode.getHeight()) ;
166
167             g.setColor(idCode.getRandomColor(180, 200)) ;
168             idCode.drawRandomLines(g, 160) ;
169             String randomString = idCode.drawRandomString(4, g) ;
170             g.dispose() ;
171             ImageIO.write(image, "JPEG", response.getOutputStream()) ;
172     }
173 }    

原文地址:https://www.cnblogs.com/gavinwu-blog/p/10088633.html

时间: 2024-10-12 02:26:27

java实现验证码图片的相关文章

java生成验证码图片

public class AuthImg extends HttpServlet { /** * */ private static final long serialVersionUID = 4975974534946437434L; // 设置图形验证码字符串的字体和大小 private Font mFont = new Font("微软雅黑", Font.ITALIC, 18); private Random random = new Random(); public void

【Selenium-WebDriver实战篇】Java丨验证码图片去除干扰像素,方便验证码的识别(转)

参考地址:https://www.cnblogs.com/haojieli/p/6212627.html 1.先来看看效果: 原图 除去干扰像素后 2.解析代码: 1).读取文件夹里面的图片 1 String fileName = "picture"; 2 BufferedImage img = ImageIO.read(new File("img//"+fileName+".jpg")); 2).获取图片的宽度和高度 1 int width =

Java如何获取图片验证码保存

举例网站:https://my.1hai.cn/Login/?url=http://www.1hai.cn/ 一.场景:出于安全性考虑,越来越多的Web平台登录都会增加图形验证码(图片),或者短信验证码.由于是图片脚本selenium是无法识别的,这是时候我们解析图片验证码. 解决思路:1.通过selenium定位到图片,把图片保存到本地. 2 通过ORC技术将图片验证码转化为文字. 其他解决方法:A:去掉验证码    B:设置万能码 二.Web图片验证码的实现源码: 1 package uti

java生成简单验证码图片

概要 最近项目需要用java实现输出随机验证码图片到前台,正好有机会接触下java的绘图类,完成需求后也有时间做个总结,写篇随笔记录下也希望能帮助到有同样需求的人! 需求流程图 1.生成随机数 在java中生成随机数无非就是调用Random的api,但为了后续更好的实用,应该分成多种组合以适应需求的变化,应将生成随机数的个数和类型组合还有排除字符抽取成参数,这个也比较简单,没有什么难度,就直接贴上代码 1 /** 2 * 生成随机验证码 3 * @param type 类型 4 * @param

Web验证码图片的生成-基于Java的实现

验证码图片是由程序动态产生的,每次访问的内容都是随机的.那么如何采用程序动态产生图片,并能够显示在客户端页面中呢?原理很简单,对于java而言,我们首先开发一个Servlet,这个Servlet的任务就是给客户端产生一个验证码图片的输入,示例代码如下: import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import ja

java随机动态生成汉字验证码图片的实例代码分享

原创不易,转载请注明出处:java随机动态生成汉字验证码图片的实例代码分享 代码下载地址:http://www.zuidaima.com/share/1809721113234432.htm 汉字验证码实现原理 将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能相对来说还是比较简单的. 效果图,如下: 验证成功后: java随机动态生成汉字验证码图片的实例代码分享

java登录验证码

一.创建web项目 使用简单servlet来演示java验证码图片生成,servlet简单使用参考http://www.cnblogs.com/ywlaker/p/6038676.html 二.生成验证码 创建VcodeObject.java,存储验证码与图片 package com.demo.vcode; import java.io.InputStream; public class VcodeObject { private String code; private InputStream

javaweb学习总结(九)—— 通过Servlet生成验证码图片

一.BufferedImage类介绍 生成验证码图片主要用到了一个BufferedImage类,如下: 创建一个DrawImage Servlet,用来生成验证码图片 1 package gacl.response.study; 2 import java.awt.Color; 3 import java.awt.Font; 4 import java.awt.Graphics; 5 import java.awt.Graphics2D; 6 import java.awt.image.Buff

输出随机验证码图片

1 /** 2 * //输出随机验证码图片:CAPTCHA图像 3 */ 4 public class ServletDemo1 extends HttpServlet { 5 private static final long serialVersionUID = 1L; 6 7 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOEx