package pic.util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class IdentifyingCode { /** * 验证码长度 */ int length = 4; /** * 验证码字体大小 */ int fontSize = 30; /** * 边框补 */ int padding = 0; /** * 是否输出燥点(默认输出) */ boolean chaos = true; /** * 输出燥点的颜色(默认灰色) */ Color chaosColor = Color.lightGray; /** * 自定义背景色(默认白色) */ Color backgroundColor = Color.white; /** * 自定义字体数组 */ String[] fonts = { "Arial", "Georgia","Times New Roman","Blue","Yellow" }; /** * 自定义随机码字符串序列(使用逗号分隔) */ String codeSerial = "0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z"; /** * 产生波形滤镜效果 */ private final double PI = 3.1415926535897932384626433832799;//此值越大,扭曲程度越大 /** * 字体长度的一对方法 * @return */ public int getLength() { return length; } public void setLength(int length) { this.length = length; } /** * 字体长度的一对方法 * @return */ public int getFontSize() { return fontSize; } public void setFontSize(int fontSize) { this.fontSize = fontSize; } /** * 边框的一对方法 * @return */ public int getPadding() { return padding; } public void setPadding(int padding) { this.padding = padding; } /** * 是否输出躁点的一对方法 * @return */ public boolean isChaos() { return chaos; } public void setChaos(boolean chaos) { this.chaos = chaos; } /** * 躁点的颜色 * @return */ public Color getChaosColor() { return chaosColor; } public void setChaosColor(Color chaosColor) { this.chaosColor = chaosColor; } /** * 背景颜色 * @return */ public Color getBackgroundColor() { return backgroundColor; } public void setBackgroundColor(Color backgroundColor) { this.backgroundColor = backgroundColor; } /** * 自定义字体样式的数组 * @return */ public String[] getFonts() { return fonts; } public void setFonts(String[] fonts) { this.fonts = fonts; } /** * 自定义随机码字符串序列,表示可输出的数字的范围 * @return */ public String getCodeSerial() { return codeSerial; } public void setCodeSerial(String codeSerial) { this.codeSerial = codeSerial; } /** * 给定范围获得随机颜色 * * @param fc * @param bc * @return */ private Color getRandColor(int fc, int bc) { Random random = new Random(); if (fc > 255) fc = 255; if (bc > 255) bc = 255; int r = fc + random.nextInt(bc - fc); int g = fc + random.nextInt(bc - fc); int b = fc + random.nextInt(bc - fc); return new Color(r, g, b); } /** * 生成校验码图片 * * @param code * @return */ private BufferedImage CreateImageCode(String code) { int fWidth = this.fontSize + this.padding; //图象的宽度 int imageWidth = (int) (code.length() * fWidth) + 4 + this.padding * 2; //图象的高度 int imageHeight = this.fontSize*2 ; // 在内存中创建图象 BufferedImage bi = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_INT_RGB); //创建画笔 Graphics graphics = bi.getGraphics(); // 将位图填充背景色 graphics.setColor(this.backgroundColor); graphics.fillRect(0, 0, bi.getWidth(), bi.getHeight()); // 生成随机类 Random random = new Random(); // 给背景添加随机生成的燥点,使图象中的认证码不易被其它程序探测到 if (this.chaos) { int c = this.length * 10; for (int i = 0; i < c; i++) { int x = random.nextInt(bi.getWidth()); int y = random.nextInt(bi.getHeight()); graphics.setColor(this.chaosColor);// 设置燥点的颜色 graphics.drawRect(x, y, 1, 1);// 生成燥点 //graphics.drawLine(x, y, y, x);//生成干扰线 } } // 随机字体和颜色的验证码字符 for (int i = 0; i < code.length(); i++) { //设置字体属性 int findex = random.nextInt(this.fonts.length); Font font = new Font(fonts[findex], Font.BOLD, this.fontSize); graphics.setFont(font); int top = (int) ((imageHeight + code.length()*2) / 1.5); if (i % 2 != 1) { top = top - code.length(); } int left = i * fWidth+code.length(); graphics.setColor(this.getRandColor(1 + i, 250 - i)); try { graphics.drawString(code.substring(i, i + 1), left, top); } catch (StringIndexOutOfBoundsException e) { System.out.print(e.toString()); } } // 画一个边框,边框颜色为Color.gray graphics.setColor(Color.gray); graphics.drawRect(0, 0, bi.getWidth() - 1, bi.getHeight() - 1); // 图象生效 graphics.dispose(); // 产生波形 //bi = TwistImage(bi, true, 8, 4); return bi; } /** * 将创建好的图片输出到页面 * * @param bi * @param response */ public void CreateImageOnPage(String code, HttpServletResponse response) { // 设置页面不缓存 response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); // 获取验证码图片 BufferedImage bi = this.CreateImageCode(code); ServletOutputStream os = null; try { os = response.getOutputStream(); // 输出图象到页面,参数1是画板,参数2是后缀名,参数三是输出流 ImageIO.write(bi,"JPEG", os); } catch (IOException e) { e.printStackTrace(); } finally { if(os != null) try { os.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 生成随机字符码 * * @param codeLen * 生成字符码的个数,0则默认的个数 * @return */ public String CreateVerifyCode(int codeLen) { if (codeLen == 0) { codeLen = this.length; } String[] arr = this.codeSerial.split(","); String code = ""; int randValue = -1; Random random = new Random(); for (int i = 0; i < codeLen; i++) { randValue = random.nextInt(arr.length - 1); code += arr[randValue]; } return code; } /** * 生成随机码,默认的方法 * @return */ public String CreateVerifyCode(){ return this.CreateVerifyCode(this.length); } }
引用
接下来的是测试类
IdentifyingCode io = new IdentifyingCode();
//在这里调用CreateVerifyCode()方法产生随机数,下面是4位
String picNum = io.CreateVerifyCode(4);
//然后生成图片
io.CreateImageOnPage(picNum, response);
发表评论
-
8888888888888
2012-07-06 21:26 0public Pooled(String name) ... ... -
77777777777777
2012-07-06 21:26 0public class Pooled extends Thr ... -
444444
2012-07-06 21:25 0public void setDebug(boolean d ... -
33333
2012-07-06 21:25 0switch (repool.getPriority()) ... -
22222
2012-07-06 21:24 0// 初始化线程list private Threa ... -
11111
2012-07-06 21:23 0// 线程数量 private int _threadC ... -
dssds
2012-07-06 21:21 0private static ThreadPool inst ... -
wedawed
2011-05-12 19:06 177# -*- coding: UTF-8 -*- #imp ... -
asa
2011-05-12 18:50 113#任务执行状态 STATE_START = 'STATE_S ... -
asda
2010-11-28 16:32 0引用 <?xml version="1.0&q ... -
使用commons-fileupload组件上传文件
2010-10-07 21:45 1115这是使用了commons-fileupload-1.2.1.j ... -
使用servlet技术来下载文件
2010-10-06 19:56 786要下载一个文件,那么就要知道这个文件mime类型,所以要先把你 ... -
使用dom4j操作xml文件
2010-10-06 19:44 1662第一种,使用dom4j生成一个xml文件 package ... -
使用oreilly上传组件上传文件
2010-10-06 19:30 671public class fileOreilly ex ... -
MD5加密
2010-10-06 19:20 887经过MD5加密后,得到16位的16进制数 public ... -
使用javaMail组件来发送邮件
2010-10-06 19:10 1240为大家介绍javaMail组件的使用,首先是发送普通的邮件 ... -
实现天气预报接口
2010-10-06 18:56 2180透过URL来获取天气预报,在jsp页面将天气显示出来 pa ...
相关推荐
python制作图片验证码(加噪)
验证码生成器,可以一键生成验证码!简单实用,适用于大部分需要验证码的场景,并且可以自己设置验证码的类型
ASP.NET验证码程序,可以生成图片,也可以直接显示文本,含调用实例
C#Graphics 验证码 验证码图片 Graphics画图 生成的是Dll,可以引用到自己的工程里。 C#控件制作的例子
HTML制作图形验证码框那种=文本框+滑块 的效果.我把背景图片作成了一个条形,你可以换成其它图片
基于PHP制作验证码 一、 开发环境 1、环境搭建:Windows 7+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0。 2、文本编辑器:Sublime 3。 二、主要技术 本案例主要基于PHP中的GD库来实现验证码的制作。 GD(graphic device...
识别程序使用delphi语言编写,以dll的方式提供使用,通过简单的函数调用即可识别复杂的验证码图片。 自动识别各种验证码 自动识别; 智能处理各种背景、边框、干扰等; 识别率可达100%(指不太复杂的验证码);本...
关于php的验证码制作ppt,可做教学用
验证码制作,包括加点划线,中文验证码,图片剪切,图片水印等 验证码制作,包括加点划线,中文验证码,图片剪切,图片水印等
本验证码识别DLL可以识别一些纯数字的验证码,压缩包中的字模库是专门为 http://www.haiguan.info/onlinesearch/gateway/Gatewaystate.aspx这个网站量身订做的
PHP实现图片验证码制作 一、开发环境 1、环境搭建:Windows 8+Apache 2.4.18+MySQL 5.7.11+PHP 7.1.0 。 2、文本编辑器:Sublime Text3。 二、主要技术 本实验主要使用while循环、GD库和函数的封装和调用实现迷宫的...
简单易用的四位彩色验证码,制作网站必备。内带验证码使用说明。
CV全自动图形图片验证码识别软件投的特点 1.优势:成本较低,使用简单,全自动进行投票,无需人工干预; 2.投票速度快,非IP限制单运行一个投票器即可达每分钟30票以上; 3.不限使用电脑数量,非IP限制投票可在一...
原创-用Ajax制作带图形验证码的登录页面.
2、部分GD库函数的介绍 imagecreatetruecolor 新建一个真彩色图像 imagecolorallocate 为一幅图像分配颜色(调色板) imagestring 绘图函数3、学习:随机函数,十六进制函数4、GD+SESSION制作PHP验证码 生成...
能够对图片内的验证码直接识别,不需要打开图片,不需要抓屏,识别精度很好,字库文件支持大漠插件的字库文件,字库制作文件已经一起打包
12(PHP图像的制作,例如验证码)配套一字体
2009-7-12 制作完成,支持3种模式:数字、数字+字母、汉字,多页面同时产生验证码而不冲突,防御能力还行。演示地址:http://www.netdust.cn/code/cs/example.aspx,我的下载:...
html5 canvas拼图拖到验证码代码,仿QQ第三方登录鼠标拖动滑块图片重叠验证代码。