| Code highlighting produced by Actipro CodeHighlighter (freeware) |
| http://www.CodeHighlighter.com/ |
|
| -->package org.javachina.util; |
|
| import java.util.Random; |
| import java.awt.image.BufferedImage; |
| import java.awt.Graphics; |
| import java.awt.Font; |
| import java.awt.Color; |
|
|
| /** |
| * 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。 |
| * 支持自定义验证码字符数量; |
| * 支持自定义验证码图片的大小; |
| * 支持自定义需排除的特殊字符; |
| * 支持自定义干扰线的数量; |
| * 支持自定义验证码图文颜色 |
| * @author org.javachina |
| * @version 1.01 |
| */ |
| public class VerifyCode { |
| |
| /** |
| * 验证码类型为仅数字 0~9 |
| */ |
| public static final int TYPE_NUM_ONLY=0; |
|
| /** |
| * 验证码类型为仅字母,即大写、小写字母混合 |
| */ |
| public static final int TYPE_LETTER_ONLY=1; |
| |
| /** |
| * 验证码类型为数字、大写字母、小写字母混合 |
| */ |
| public static final int TYPE_ALL_MIXED=2; |
|
| /** |
| * 验证码类型为数字、大写字母混合 |
| */ |
| public static final int TYPE_NUM_UPPER=3; |
| |
| /** |
| * 验证码类型为数字、小写字母混合 |
| */ |
| public static final int TYPE_NUM_LOWER=4; |
| |
| /** |
| * 验证码类型为仅大写字母 |
| */ |
| public static final int TYPE_UPPER_ONLY=5; |
| |
| /** |
| * 验证码类型为仅小写字母 |
| */ |
| public static final int TYPE_LOWER_ONLY=6; |
| |
| |
| private VerifyCode(){} |
|
| /** |
| * 生成验证码字符串 |
| * @param type 验证码类型,参见本类的静态属性 |
| * @param length 验证码长度,大于0的整数 |
| * @param exChars 需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null) |
| * @return 验证码字符串 |
| */ |
| public static String generateTextCode(int type,int length,String exChars){ |
| |
| if(length<=0) return ""; |
| |
| StringBuffer code=new StringBuffer(); |
| int i=0; |
| Random r=new Random(); |
| |
| switch(type) |
| { |
| |
| //仅数字 |
| case TYPE_NUM_ONLY: |
| while(i<length){ |
| int t=r.nextInt(10); |
| if(exChars==null | | exChars.indexOf(t+"")<0){//排除特殊字符 |
| code.append(t); |
| i++; |
| } |
| } |
| break; |
| |
| //仅字母(即大写字母、小写字母混合) |
| case TYPE_LETTER_ONLY: |
| while(i<length){ |
| int t=r.nextInt(123); |
| if((t>=97 | | (t>=65&&t<=90))&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| //数字、大写字母、小写字母混合 |
| case TYPE_ALL_MIXED: |
| while(i<length){ |
| int t=r.nextInt(123); |
| if((t>=97 | | (t>=65&&t<=90) | | (t>=48&&t<=57))&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| //数字、大写字母混合 |
| case TYPE_NUM_UPPER: |
| while(i<length){ |
| int t=r.nextInt(91); |
| if((t>=65 | | (t>=48&&t<=57))&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| //数字、小写字母混合 |
| case TYPE_NUM_LOWER: |
| while(i<length){ |
| int t=r.nextInt(123); |
| if((t>=97 | | (t>=48&&t<=57))&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| //仅大写字母 |
| case TYPE_UPPER_ONLY: |
| while(i<length){ |
| int t=r.nextInt(91); |
| if((t>=65)&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| //仅小写字母 |
| case TYPE_LOWER_ONLY: |
| while(i<length){ |
| int t=r.nextInt(123); |
| if((t>=97)&&(exChars==null | | exChars.indexOf((char)t)<0)){ |
| code.append((char)t); |
| i++; |
| } |
| } |
| break; |
| |
| } |
| |
| return code.toString(); |
| } |
|
| |
| /** |
| * 已有验证码,生成验证码图片 |
| * @param textCode 文本验证码 |
| * @param width 图片宽度 |
| * @param height 图片高度 |
| * @param interLine 图片中干扰线的条数 |
| * @param randomLocation 每个字符的高低位置是否随机 |
| * @param backColor 图片颜色,若为null,则采用随机颜色 |
| * @param foreColor 字体颜色,若为null,则采用随机颜色 |
| * @param lineColor 干扰线颜色,若为null,则采用随机颜色 |
| * @return 图片缓存对象 |
| */ |
| public static BufferedImage generateImageCode(String textCode,int width,int height,int interLine, |
| boolean randomLocation,Color backColor,Color foreColor,Color lineColor){ |
| |
| |
| BufferedImage bim=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); |
| Graphics g=bim.getGraphics(); |
| |
| //画背景图 |
| g.setColor(backColor==null?getRandomColor():backColor); |
| g.fillRect(0,0,width,height); |
| |
| //画干扰线 |
| Random r=new Random(); |
| if(interLine>0){ |
| |
| int x=0,y=0,x1=width,y1=0; |
| for(int i=0;i<interLine;i++){ |
| g.setColor(lineColor==null?getRandomColor():lineColor); |
| y=r.nextInt(height); |
| y1=r.nextInt(height); |
| |
| g.drawLine(x,y,x1,y1); |
| } |
| } |
| |
| //写验证码 |
| |
| //g.setColor(getRandomColor()); |
| //g.setColor(isSimpleColor?Color.BLACK:Color.WHITE); |
| |
| //字体大小为图片高度的80% |
| int fsize=(int)(height*0.8); |
| int fx=height-fsize; |
| int fy=fsize; |
|
| g.setFont(new Font(Font.DIALOG,Font.PLAIN,fsize)); |
| |
| //写验证码字符 |
| for(int i=0;i<textCode.length();i++){ |
| fy=randomLocation?(int)((Math.random()*0.3+0.6)*height):fy;//每个字符高低是否随机 |
| g.setColor(foreColor==null?getRandomColor():foreColor); |
| g.drawString(textCode.charAt(i)+"",fx,fy); |
| fx+=fsize*0.9; |
| } |
|
| |
| g.dispose(); |
| |
| return bim; |
| } |
|
| |
| |
| /** |
| * 生成图片验证码 |
| * @param type 验证码类型,参见本类的静态属性 |
| * @param length 验证码字符长度,大于0的整数 |
| * @param exChars 需排除的特殊字符 |
| * @param width 图片宽度 |
| * @param height 图片高度 |
| * @param interLine 图片中干扰线的条数 |
| * @param randomLocation 每个字符的高低位置是否随机 |
| * @param backColor 图片颜色,若为null,则采用随机颜色 |
| * @param foreColor 字体颜色,若为null,则采用随机颜色 |
| * @param lineColor 干扰线颜色,若为null,则采用随机颜色 |
| * @return 图片缓存对象 |
| */ |
| public static BufferedImage generateImageCode(int type,int length,String exChars,int width,int height,int interLine,boolean randomLocation,Color backColor,Color foreColor,Color lineColor){ |
| |
| String textCode=generateTextCode(type,length,exChars); |
| BufferedImage bim=generateImageCode(textCode,width,height,interLine,randomLocation,backColor,foreColor,lineColor); |
| |
| return bim; |
| } |
| |
| |
| /** |
| * 产生随机颜色 |
| * @return |
| */ |
| private static Color getRandomColor(){ |
| Random r=new Random(); |
| Color c=new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)); |
| return c; |
| } |
| |
|
| public static void main(String[] args){ |
|
| } |
|
| } |
|