1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package com.octo.captcha.engine.image.gimpy;
20
21 import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
22 import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
23 import com.octo.captcha.component.image.color.RandomListColorGenerator;
24 import com.octo.captcha.component.image.deformation.ImageDeformation;
25 import com.octo.captcha.component.image.deformation.ImageDeformationByBufferedImageOp;
26 import com.octo.captcha.component.image.fontgenerator.FontGenerator;
27 import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
28 import com.octo.captcha.component.image.textpaster.*;
29 import com.octo.captcha.component.image.textpaster.glyphsvisitor.*;
30 import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;
31 import com.octo.captcha.engine.image.ListImageCaptchaEngine;
32 import com.jhlabs.image.PinchFilter;
33 import com.jhlabs.math.ImageFunction2D;
34
35 import java.awt.*;
36 import java.util.*;
37 import java.util.List;
38
39 /***
40 * <p/>
41 * This is the default captcha engine. It provides a sample gimpy challenge that has no automated solution known. It is
42 * based on the Baffle SPARC Captcha.
43 * <p/>
44 * </p>
45 *
46 * @author <a href="mailto:mag@jcaptcha.net">Marc-Antoine Garrigue</a>
47 * @version 1.0
48 */
49 public class GmailEngine extends ListImageCaptchaEngine {
50
51 /***
52 * this method should be implemented as folow : <ul> <li>First construct all the factories you want to initialize
53 * the gimpy with</li> <li>then call the this.addFactoriy method for each factory</li> </ul>
54 */
55 protected void buildInitialFactories() {
56
57
58 com.octo.captcha.component.word.wordgenerator.WordGenerator dictionnaryWords =
59 new com.octo.captcha.component.word.wordgenerator.ComposeDictionaryWordGenerator(
60 new com.octo.captcha.component.word.FileDictionary(
61 "toddlist"));
62
63 TextPaster randomPaster = new GlyphsPaster(7, 7,
64 new RandomListColorGenerator(
65 new Color[]{
66 new Color(23, 170, 27),
67 new Color(220, 34, 11),
68 new Color(23, 67, 172)})
69 ,new GlyphsVisitors[]{
70 new TranslateGlyphsVerticalRandomVisitor(1),
71
72 new OverlapGlyphsUsingShapeVisitor(3),
73 new TranslateAllToRandomPointVisitor()
74
75
76
77 });
78
79
80
81
82
83 BackgroundGenerator back = new UniColorBackgroundGenerator(
84 200, 70, Color.white);
85
86 FontGenerator shearedFont = new RandomFontGenerator(50,
87 50,
88 new Font[]{
89 new Font("nyala",Font.BOLD, 50)
90 ,
91 new Font("Bell MT", Font.PLAIN, 50)
92 ,
93 new Font("Credit valley", Font.BOLD, 50)
94 }
95 ,false);
96
97
98 PinchFilter pinch = new PinchFilter();
99
100 pinch.setAmount(-.5f);
101 pinch.setRadius(70);
102 pinch.setAngle((float) (Math.PI/16));
103 pinch.setCentreX(0.5f);
104 pinch.setCentreY(-0.01f);
105 pinch.setEdgeAction(ImageFunction2D.CLAMP);
106
107 PinchFilter pinch2 = new PinchFilter();
108 pinch2.setAmount(-.6f);
109 pinch2.setRadius(70);
110 pinch2.setAngle((float) (Math.PI/16));
111 pinch2.setCentreX(0.3f);
112 pinch2.setCentreY(1.01f);
113 pinch2.setEdgeAction(ImageFunction2D.CLAMP);
114
115 PinchFilter pinch3 = new PinchFilter();
116 pinch3.setAmount(-.6f);
117 pinch3.setRadius(70);
118 pinch3.setAngle((float) (Math.PI/16));
119 pinch3.setCentreX(0.8f);
120 pinch3.setCentreY(-0.01f);
121 pinch3.setEdgeAction(ImageFunction2D.CLAMP);
122
123
124
125 List<ImageDeformation> textDef = new ArrayList<ImageDeformation>();
126 textDef.add(new ImageDeformationByBufferedImageOp(pinch));
127 textDef.add(new ImageDeformationByBufferedImageOp(pinch2));
128 textDef.add(new ImageDeformationByBufferedImageOp(pinch3));
129
130
131 com.octo.captcha.component.image.wordtoimage.WordToImage word2image;
132 word2image = new DeformedComposedWordToImage(false,shearedFont, back, randomPaster,
133 new ArrayList<ImageDeformation>(),
134 new ArrayList<ImageDeformation>(),
135 textDef
136
137
138 );
139
140
141 this.addFactory(
142 new com.octo.captcha.image.gimpy.GimpyFactory(dictionnaryWords,
143 word2image, false));
144
145 }
146 }