package com.jspxcms.common.security;
import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import com.jhlabs.image.PinchFilter;
import com.jhlabs.math.ImageFunction2D;
import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.UniColorBackgroundGenerator;
import com.octo.captcha.component.image.color.ColorGenerator;
import com.octo.captcha.component.image.color.RandomListColorGenerator;
import com.octo.captcha.component.image.deformation.ImageDeformation;
import com.octo.captcha.component.image.deformation.ImageDeformationByBufferedImageOp;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.GlyphsPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.textpaster.glyphsvisitor.GlyphsVisitors;
import com.octo.captcha.component.image.textpaster.glyphsvisitor.OverlapGlyphsUsingShapeVisitor;
import com.octo.captcha.component.image.textpaster.glyphsvisitor.TranslateAllToRandomPointVisitor;
import com.octo.captcha.component.image.textpaster.glyphsvisitor.TranslateGlyphsVerticalRandomVisitor;
import com.octo.captcha.component.image.wordtoimage.DeformedComposedWordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
/**
* 仿Gmail验证码引擎
*
* @author liufang
*
*/
public class GmailEngine extends
com.octo.captcha.engine.image.ImageCaptchaEngine {
@SuppressWarnings("unchecked")
public GmailEngine(WordGenerator wordGen, FontGenerator fontGen,
ColorGenerator colerGen, BackgroundGenerator backGen, int min,
int max, float radius) {
TextPaster randomPaster = new GlyphsPaster(min, max, colerGen,
new GlyphsVisitors[] {
new TranslateGlyphsVerticalRandomVisitor(1),
new OverlapGlyphsUsingShapeVisitor(3),
new TranslateAllToRandomPointVisitor() });
PinchFilter pinch = new PinchFilter();
pinch.setAmount(-.5f);
pinch.setRadius(radius);
pinch.setAngle((float) (Math.PI / 16));
pinch.setCentreX(0.5f);
pinch.setCentreY(-0.01f);
pinch.setEdgeAction(ImageFunction2D.CLAMP);
PinchFilter pinch2 = new PinchFilter();
pinch2.setAmount(-.6f);
pinch2.setRadius(radius);
pinch2.setAngle((float) (Math.PI / 16));
pinch2.setCentreX(0.3f);
pinch2.setCentreY(1.01f);
pinch2.setEdgeAction(ImageFunction2D.CLAMP);
PinchFilter pinch3 = new PinchFilter();
pinch3.setAmount(-.6f);
pinch3.setRadius(radius);
pinch3.setAngle((float) (Math.PI / 16));
pinch3.setCentreX(0.8f);
pinch3.setCentreY(-0.01f);
pinch3.setEdgeAction(ImageFunction2D.CLAMP);
List<ImageDeformation> textDef = new ArrayList<ImageDeformation>();
textDef.add(new ImageDeformationByBufferedImageOp(pinch));
textDef.add(new ImageDeformationByBufferedImageOp(pinch2));
textDef.add(new ImageDeformationByBufferedImageOp(pinch3));
com.octo.captcha.component.image.wordtoimage.WordToImage word2image;
word2image = new DeformedComposedWordToImage(false, fontGen, backGen,
randomPaster, new ArrayList<ImageDeformation>(),
new ArrayList<ImageDeformation>(), textDef);
factories.add(new com.octo.captcha.image.gimpy.GimpyFactory(wordGen,
word2image, false));
}
public GmailEngine() {
this(new RandomWordGenerator("ABCDEGHJKLMNRSTUWXY235689"),
new RandomFontGenerator(40, 40, new Font[] {
new Font("nyala", Font.BOLD, 40),
new Font("Bell MT", Font.PLAIN, 40),
new Font("Credit valley", Font.BOLD, 40) }, false),
new RandomListColorGenerator(new Color[] {
new Color(23, 170, 27), new Color(220, 34, 11),
new Color(23, 67, 172) }),
new UniColorBackgroundGenerator(150, 40, Color.white), 5, 6, 30);
}
}