1
2
3
4
5
6
7 package com.octo.captcha.component.image.backgroundgenerator;
8
9 import com.octo.captcha.component.image.color.ColorGenerator;
10 import com.octo.captcha.component.image.color.SingleColorGenerator;
11
12 import java.awt.*;
13 import java.awt.geom.Ellipse2D;
14 import java.awt.geom.Rectangle2D;
15 import java.awt.image.BufferedImage;
16
17 /***
18 * <p/>
19 * Draw mutliple different shape with different colors. see attributes to construct it in a proper way. </p>
20 *
21 * @author <a href="mailto:mga@octo.com">Mathieu Gandin </a>
22 * @version 1.0
23 */
24 public class MultipleShapeBackgroundGenerator extends
25 AbstractBackgroundGenerator {
26
27 public MultipleShapeBackgroundGenerator(Integer width, Integer height) {
28 super(width, height);
29 }
30
31 /***
32 * Default value for the first color (black) of the gradient paint of ellipses.
33 */
34 private ColorGenerator firstEllipseColorGenerator = new SingleColorGenerator(new Color(210, 210, 210));
35
36 /***
37 * Default value for the first color (White) of the gradient paint of ellipses.
38 */
39 private ColorGenerator secondEllipseColorGenerator = new SingleColorGenerator(new Color(0, 0, 0));
40
41 /***
42 * Default value for the first color (black) of the gradient paint of rectangles.
43 */
44 private ColorGenerator firstRectangleColorGenerator = new SingleColorGenerator(new Color(210, 210, 210));
45
46 /***
47 * Default value for the first color (White) of the gradient paint of rectangles.
48 */
49 private ColorGenerator secondRectangleColorGenerator = new SingleColorGenerator(new Color(0, 0, 0));
50
51 /***
52 * Default space between lines: 10 pixels.
53 */
54 private Integer spaceBetweenLine = new Integer(10);
55
56 /***
57 * Default space between circles: 10 pixels.
58 */
59 private Integer spaceBetweenCircle = new Integer(10);
60
61 /***
62 * Default height for the ellipse: 8 pixels.
63 */
64 private Integer ellipseHeight = new Integer(8);
65
66 /***
67 * Default width for the ellipse: 8 pixels.
68 */
69 private Integer ellipseWidth = new Integer(8);
70
71 /***
72 * Default width for the rectangle: 3 pixels.
73 */
74 private Integer rectangleWidth = new Integer(3);
75
76 public MultipleShapeBackgroundGenerator(Integer width, Integer height,
77 Color firstEllipseColor, Color secondEllipseColor,
78 Integer spaceBetweenLine, Integer spaceBetweenCircle,
79 Integer ellipseHeight, Integer ellipseWidth,
80 Color firstRectangleColor, Color secondRectangleColor,
81 Integer rectangleWidth) {
82
83 super(width, height);
84
85 if (firstEllipseColor != null)
86 this.firstEllipseColorGenerator = new SingleColorGenerator(firstEllipseColor);
87 if (secondEllipseColor != null)
88 this.secondEllipseColorGenerator = new SingleColorGenerator(secondEllipseColor);
89 if (spaceBetweenLine != null)
90 this.spaceBetweenLine = spaceBetweenCircle;
91 if (spaceBetweenCircle != null)
92 this.spaceBetweenCircle = spaceBetweenCircle;
93 if (ellipseHeight != null)
94 this.ellipseHeight = ellipseHeight;
95 if (ellipseWidth != null)
96 this.ellipseWidth = ellipseWidth;
97 if (firstRectangleColor != null)
98 this.firstRectangleColorGenerator = new SingleColorGenerator(firstRectangleColor);
99 if (secondRectangleColor != null)
100 this.secondRectangleColorGenerator = new SingleColorGenerator(secondRectangleColor);
101 if (rectangleWidth != null)
102 this.rectangleWidth = rectangleWidth;
103 }
104
105
106 /***
107 * Main method. It generates a background of the captcha with a large number of lines, ellipse, and gradient paint.
108 *
109 * @return the background full of shapes
110 */
111 public BufferedImage getBackground() {
112 BufferedImage bi = new BufferedImage(getImageWidth(), getImageHeight(),
113 BufferedImage.TYPE_INT_RGB);
114 Graphics2D g2 = (Graphics2D) bi.getGraphics();
115 g2.setBackground(Color.white);
116 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
117 RenderingHints.VALUE_ANTIALIAS_ON);
118
119 for (int variableOnWidth = 0; variableOnWidth < getImageWidth(); variableOnWidth = variableOnWidth + this.getSpaceBetweenLine())
120 {
121 Color firstEllipseColor = this.firstEllipseColorGenerator
122 .getNextColor();
123 Color secondEllipseColor = this.secondEllipseColorGenerator
124 .getNextColor();
125 Color firstRectangleColor = this.firstRectangleColorGenerator
126 .getNextColor();
127 Color secondRectangleColor = this.secondRectangleColorGenerator
128 .getNextColor();
129 for (int variableOnHeight = 0; variableOnHeight < getImageHeight(); variableOnHeight = variableOnHeight
130 + this.getSpaceBetweenCircle()) {
131 Ellipse2D e2 = new Ellipse2D.Double(variableOnWidth, variableOnHeight, this
132 .getEllipseWidth(), this.getEllipseHeight());
133 GradientPaint gp = new GradientPaint(0,
134 this.getEllipseHeight(), firstEllipseColor, this
135 .getEllipseWidth(), 0, secondEllipseColor, true);
136
137 g2.setPaint(gp);
138 g2.fill(e2);
139 }
140 GradientPaint gp2 = new GradientPaint(0, getImageHeight(),
141 firstRectangleColor, this.getRectangleWidth(), 0,
142 secondRectangleColor, true);
143 g2.setPaint(gp2);
144 Rectangle2D r2 = new Rectangle2D.Double(variableOnWidth, 0, this
145 .getRectangleWidth(), getImageHeight());
146 g2.fill(r2);
147 }
148 g2.dispose();
149 return bi;
150 }
151
152 /***
153 * Helper method to get the int value of the number of pixels between lines.
154 *
155 * @return number of pixels between lines.
156 */
157 protected int getSpaceBetweenLine() {
158 return this.spaceBetweenLine.intValue();
159 }
160
161 /***
162 * Helper method to get the int value of the number of pixels between circles.
163 *
164 * @return number of pixels between circles.
165 */
166 protected int getSpaceBetweenCircle() {
167 return this.spaceBetweenCircle.intValue();
168 }
169
170 /***
171 * Helper method to get the height of drawn ellipses.
172 *
173 * @return height of ellipses.
174 */
175 protected int getEllipseHeight() {
176 return this.ellipseHeight.intValue();
177 }
178
179 /***
180 * Helper method to get the width of drawn ellipses.
181 *
182 * @return width of ellipses.
183 */
184 protected int getEllipseWidth() {
185 return this.ellipseWidth.intValue();
186 }
187
188 /***
189 * Helper method to get the width of drawn rectangles.
190 *
191 * @return width of rectangles.
192 */
193 protected int getRectangleWidth() {
194 return this.rectangleWidth.intValue();
195 }
196 }