View Javadoc

1   /*
2    * JCaptcha, the open source java framework for captcha definition and integration
3    * Copyright (c)  2007 jcaptcha.net. All Rights Reserved.
4    * See the LICENSE.txt file distributed with this package.
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 }