David.Turing's blog

 

A Java Sample For jCaptcha

Captcha  is very easy to used, i write a little java sample to proved its powerful feature!

So first download the jcaptcha-all-1.0-RC3.jar From http://jcaptcha.sourceforge.net/
Then Run the following sample.


/*
 *Copyright ? 2006 David.turing
 *Email: securex@163.com
 *QQ群:14966586
 *Blog: openssl.blogjava.net
 
*/

package  org.dev2dev.image.captcha;

import  java.awt.Color;
import  java.awt.Font;
import  java.awt.font.TextAttribute;
import  java.awt.image.BufferedImage;
import  java.io.File;
import  java.io.IOException;
import  java.text.AttributedString;

import  javax.imageio.ImageIO;

import  com.octo.captcha.CaptchaException;
import  com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import  com.octo.captcha.component.image.backgroundgenerator.GradientBackgroundGenerator;
import  com.octo.captcha.component.image.fontgenerator.FontGenerator;
import  com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import  com.octo.captcha.component.image.textpaster.SimpleTextPaster;
import  com.octo.captcha.component.image.textpaster.TextPaster;

public   class  CaptchaHelper {

    
private  FontGenerator fontGenerator;

    
private  BackgroundGenerator background;

    
private  TextPaster textPaster;

    
public   void  init(FontGenerator fontGenerator,
            BackgroundGenerator background, TextPaster textPaster) {
        
this .background  =  background;
        
this .fontGenerator  =  fontGenerator;
        
this .textPaster  =  textPaster;
    }

    
public  BufferedImage getImage(String word)  throws  CaptchaException {
        
int  wordLength;
        
// Check your word Lenth
        wordLength  =  checkWordLength(word);
        
// Process font for word
        AttributedString attributedWord  =  getAttributedString(word, wordLength);
        
// Contruct your Backgroud
        BufferedImage background  =  getBackround();
        
// Contruct your captcha image include your word!
         return  pasteText(background, attributedWord);

    }

    
public  AttributedString getAttributedString(String word,  int  wordLength) {
        AttributedString attributedWord 
=   new  AttributedString(word);
        
// Here, we provide each char of the word a kind of font, so,  n char, n font, hehe 
         for  ( int  i  =   0 ; i  <  wordLength; i ++ ) {
            Font font 
=  getFont(); // get the new font for next character
            attributedWord.addAttribute(TextAttribute.FONT, font, i, i  +   1 );
        }
        
return  attributedWord;
    }

    
int  checkWordLength(String word)  throws  CaptchaException {
        
int  wordLength;
        
if  (word  ==   null ) {
            
throw   new  CaptchaException( " CaptchaHelper:null word " );
        } 
else  {
            wordLength 
=  word.length();
            
if  (wordLength  >   this .getMaxAcceptedWordLength()
                    
||  wordLength  <  getMinAcceptedWordLength()) {
                
throw   new  CaptchaException( " CaptchaHelper:invalid length word " );
            }
        }
        
return  wordLength;
    }

    
/**
     * 
@return  the max word length accepted by this word2image service
     
*/
    
public   int  getMaxAcceptedWordLength() {
        
return  textPaster.getMaxAcceptedWordLength();
    }

    
/**
     * 
@return  the min word length accepted by this word2image service
     
*/
    
public   int  getMinAcceptedWordLength() {
        
return  textPaster.getMinAcceptedWordLength();
    }

    
/**
     * 
@return  the generated image height
     
*/
    
public   int  getImageHeight() {
        
return  background.getImageHeight();
    }

    
/**
     * 
@return  teh generated image width
     
*/
    
public   int  getImageWidth() {
        
return  background.getImageWidth();
    }

    
/**
     * 
@return  the min font size for the generated image
     
*/
    
public   int  getMinFontSize() {
        
return  fontGenerator.getMinFontSize();
    }

    
/**
     * Method from imageFromWord method to apply font to String. Implementations must take into account the minFontSize
     * and the MaxFontSize.
     *
     * 
@return  a Font
     
*/
    Font getFont() {
        
return  fontGenerator.getFont();
    }

    
/**
     * Generates a backround image on wich text will be paste. Implementations must take into account the imageHeigt and
     * imageWidth.
     *
     * 
@return  the background image
     
*/
    BufferedImage getBackround() {
        
return  background.getBackground();
    }

    
/**
     * Pastes the attributed string on the backround image and return the final image. Implementation must take into
     * account the fact that the text must be readable by human and non by programs
     *
     * 
@return  the final image
     *
     * 
@throws  CaptchaException if any exception accurs during paste routine.
     
*/
    BufferedImage pasteText(BufferedImage background,
            AttributedString attributedWord) 
throws  CaptchaException {
        
return  textPaster.pasteText(background, attributedWord);
    }

    
/**
     * 
@param  args
     
*/
    
public   static   void  main(String[] args) {

        Integer minAcceptedWordLength 
=   new  Integer( 5 );
        Integer maxAcceptedWordLength 
=   new  Integer( 30);
        Integer imageHeight 
= new Integer(100);
        Integer imageWidth 
= new Integer(400);
        Integer minFontSize 
= new Integer(30);
        Integer maxFontSize 
= new Integer(30);

        BackgroundGenerator background 
= new GradientBackgroundGenerator(
                imageWidth, imageHeight, Color.white, Color.white);
        FontGenerator fontGenerator 
= new RandomFontGenerator(minFontSize,
                maxFontSize);
        TextPaster textPaster 
= new SimpleTextPaster(minAcceptedWordLength,
                maxAcceptedWordLength, Color.blue);
        CaptchaHelper chelper 
= new CaptchaHelper();
        chelper.init(fontGenerator, background, textPaster);

        BufferedImage test 
= chelper.getImage("openssl.blogjava.net");
        
if (test != null)
            System.out.println(
"width=" + test.getWidth());
        File testfile 
= new File("c:\\a.png");

        
try {
            
// well the captcha picture is generate, open the png file!
            ImageIO.write(test, "PNG", testfile);
        } 
catch (IOException e) {
            e.printStackTrace();
        }

    }

}

posted on 2006-06-20 22:10 david.turing 阅读(2615) 评论(1)  编辑  收藏 所属分类: Security领域

评论

# re: A Java Sample For jCaptcha 2008-01-22 02:14 gnmgfnm

gfumfgum  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(110)

我参与的团队

随笔分类(126)

随笔档案(155)

文章分类(9)

文章档案(19)

相册

搜索

积分与排名

最新随笔

最新评论

阅读排行榜

评论排行榜