Jcaptcha验证码介绍

组件介绍

组件 作用
FontGenerator 设置字体随机大小范围,字体名称
BackgroundGenerator 设置背景颜色图片大小
TextPaster 设置单词的最小最大长度,设置字的颜色,设置单词在图像中的位置是固定还是随机
ImageDeformation、ImageFilter 非必须,指定为图片变形的类,可以用变形类和过滤器两种方式
WordToImage 将FontGenerator、BackgroundGenerator、TextPaster、ImageDeformation和ImageFilter组装到一起,属于中间环节的类,类似一个容器
WordGenerator 设置取词的范围,设置一定范围,或从本地词库读取
CaptchaFactory 将配置的类,组成工程类, 也属于包装类

结构图如下:

使用

FontGenerator

Font类,用于设置字体的样式和字体随机的大小范围

在com.octo.captcha.component.image.fontgenerator包中包含了几种Font类

Font 作用 示例 效果
RandomFontGenerator 设置随机出现的字体样式随机的字体大小范围 RandomFontGenerator fonts = new RandomFontGenerator (new Integer(20), new Integer(30));
TwistedRandomFontGenerator 设置字体的随机大小范围,并对字体进行简单的扭曲变形,字体左右倾斜的效果 TwistedRandomFontGenerator fonts = new TwistedRandomFontGenerator(new Integer(20), new Integer(30));
TwistedAndShearedRandomFontGenerator TwistedRandomFontGenerator的子类,和 TwistedRandomFontGenerator类的构造器参数也相同,显示效果相近,采用的算法有所不同
DeformedRandomFontGenerator 构造器的参数和上两个类相同,采用的方式也类似

BackgroundGenerator

Background设置背景颜色或背景图片、设置图片大小

在com.octo.captcha.component.image.backgroundgenerator包中包含了的Background类

Background 作用 示例 效果
UniColorBackgroundGenerator 设置图片大小和以单一颜色为背景的图片背景,可以设置一个或多个备选颜色。
如果想让颜色更加多变,则可以使用RandomRangeColorGenerator类,设置随机取得的RGB值,让RGB值分别的随机取得,则RGB值随机搭配的颜色将会更加多变
UniColorBackgroundGenerator background = new UniColorBackgroundGenerator(new Integer(200), new Integer(100), Color.BLUE);
MultipleShapeBackgroundGenerator 设置一种多变的背景花纹 MultipleShapeBackgroundGenerator background = new MultipleShapeBackgroundGenerator (200,100,Color.RED,Color.BLUE,10,10,8,8,Color.WHITE,Color.YELLOW,3);
GradientBackgroundGenerator 设置一种渐变颜色的背景,也可以设置多种颜色的渐变背景 GradientBackgroundGenerator background = new GradientBackgroundGenerator(200, 100, Color.BLACK, Color.WHITE);
FunkyBackgroundGenerator 设置四种不同颜色混杂在一起的背景。
如果创建过程中,给SingleColorGenerator类改为使用RandomListColorGenerator或其他类,也可以让四种颜色随机变化
SingleColorGenerator leftUpColor = new SingleColorGenerator(Color.RED); SingleColorGenerator leftDownColor = new SingleColorGenerator(Color.YELLOW); SingleColorGenerator rightUpColor = new SingleColorGenerator(Color.BLUE); SingleColorGenerator rightDownColor = new SingleColorGenerator(Color.GREEN); FunkyBackgroundGenerator background = new FunkyBackgroundGenerator( 200, 100, leftUpColor, leftDownColor, rightUpColor, rightDownColor, 0.5f);
FileReaderRandomBackgroundGenerator 设置从指定目录读取图片作为生成图片的背景,目录中的图片,会在类构造期间就全部读取到内存 FileReaderRandomBackgroundGenerator background = new FileReaderRandomBackgroundGenerator(200, 100, "E:¥¥testproject¥¥jcaptcha¥¥images¥¥backgrounds");
EllipseBackgroundGenerator 一种花样的背景,该类到目前为止没有更多的配置选项,只能设置图片大小,颜色和其他相关的值都不能设置

TextPaster

TextPaster可以设置单词的最小和最大长度和设置字的颜色(前景颜色),设置单词在图像中的位置是固定还是随机
在com.octo.captcha.component.image.textpaster包中包含了的常用TextPaster类

TextPaster 作用 示例 效果
RandomTextPaster 最常用的TextPaster,可以设置生成单词的随机长度范围,和设置一种或多种前景颜色,生成的字符串在图像中的位置是随机 RandomTextPaster textPaster = new RandomTextPaster(new Integer(5), new Integer(10), Color.BLACK);

也可以设置多种随机前景颜色:Color[] colors = new Color[]{Color.RED,Color.YELLOW,Color.BLUE}; RandomListColorGenerator randomColors = new RandomListColorGenerator(colors); RandomTextPaster textPaster = new RandomTextPaster(new Integer(5), new Integer(10), randomColors);
SimpleTextPaster 和RandomTextPaster用法和参数都相同,但是生成的字符串位置不变
NonLinearTextPaster 设置非直线的TextPaster,最后生成的文本成非直线的排列 NonLinearTextPaster textPaster = new NonLinearTextPaster (new Integer(5), new Integer(10), Color.BLACK);
DoubleTextPaster 可以形成两行好像重影效果的文本,单词位置固定 DoubleTextPaster textPaster = new DoubleTextPaster(new Integer(5),new Integer(10), Color.BLACK);
DoubleRandomTextPaster 和DoubleTextPaster类类似的效果,但是单词在图像中出现的位置和第二行字上下位置,是随机的
DecoratedRandomTextPaster 为生成的文本加上修饰,例如干扰线干扰点 SingleColorGenerator lineColor = new SingleColorGenerator(Color.BLUE); TextDecorator decorator1 = new LineTextDecorator(new Integer(1), lineColor, AlphaComposite.SRC_OVER); TextDecorator[] decorators = new TextDecorator[] { decorator1 }; SingleColorGenerator color = new SingleColorGenerator(Color.RED); DecoratedRandomTextPaster textPaster = new DecoratedRandomTextPaster(new Integer(5), new Integer(10), color, decorators);

LineTextDecorator的构造器的最后一个参数是干扰线的类型,在该参数上进行修改,也能取得不错的效果,例如将AlphaComposite.SRC_OVER改为AlphaComposite.CLEAR、AlphaComposite.SRC_IN、AlphaComposite.XOR

LineTextDecorator类是线型的装饰器,Captcha还提供了一种点状的装饰类:
SingleColorGenerator dColor = new SingleColorGenerator(Color.BLUE); TextDecorator decorator2 = new BaffleTextDecorator(new Integer(1), dColor, AlphaComposite.SRC_OUT); TextDecorator[] decorators = new TextDecorator[] { decorator2 }; SingleColorGenerator color = new SingleColorGenerator(Color.RED); DecoratedRandomTextPaster textPaster = new DecoratedRandomTextPaster(new Integer(5), new Integer(10), color, decorators);








Deformation和ImageFilter

    这两种类,都提供了对图片字体进行进一步变形的功能,Deformation类是Captcha框架中提供的变形类 和接口,ImageFilter是一个使用java提供图形图像方面服务的公司提供的通用的图形变形过滤器,可以实现的效果很多。

    Deformation和ImageFilter都分为3层,一种是在文字级别的,一种是在背景级别的,还有在整个图片级别的,用于在图片生成不同的阶段对图片进行变形。

    Deformation类,当前Captcha只提供了一种选择,就是PuzzleImageDeformation类,该类的效果是将 图片旋转,然后直接贴在原来图片的上面,所以效果不是很好,相信以后Captcha会提供更多的Deformation类,并且会不断完善,但是目前,不推荐使用。

    ImageFilter过滤器,有很多现有的资源可以供选择使用,是目前最好的选择。

// font  
RandomFontGenerator fonts = new RandomFontGenerator(new Integer(20), new Integer(20));  

// background  
BackgroundGenerator background = new UniColorBackgroundGenerator(new Integer(400), new Integer(300), Color.white);  

// textPaster  
RandomTextPaster textPaster =  new RandomTextPaster(new Integer(5), new Integer(5), Color.BLACK);  

// no deformation  
ImageDeformation noneDeformation = new ImageDeformationByFilters( new ImageFilter[] {});

// filter创建过滤器  
ImageDeformation filters =  new ImageDeformationByFilters( new ImageFilter[] { new TwirlFilter() });  DeformedComposedWordToImage cwti =   new DeformedComposedWordToImage(fonts, background, textPaster, noneDeformation, filters, noneDeformation);  

// 设置随机取词范围
RandomWordGenerator words = new RandomWordGenerator("ABCDEFGHIJKLMNOPQRSTUVWXYZ");
GimpyFactory gimpy = new GimpyFactory(words, cwti);  
SimpleListImageCaptchaEngine engine = new SimpleListImageCaptchaEngine();
engine.setFactories(new CaptchaFactory[] { gimpy });  
FastHashMapCaptchaStore captchaStore = new FastHashMapCaptchaStore();

// 创建Captcha服务  
DefaultManageableImageCaptchaService defaultService = new  DefaultManageableImageCaptchaService(captchaStore, engine, 180, 100000, 75000);  
return defaultService;

    上述的代码,是在创建一个Captcha服务器的过程中,将过滤器加入其中,其中使用的font、background、 和testPaster类,都使用了最简单的,没有变形效果的类,意在只查看过滤器对整个图片的映像。

更多过滤器效果,可以参见Java Image Filters

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容