作者:夢想年華 日期:2006-09-12
字型大小: 小 中 大
一個用Java生成的彩色驗證碼。
程式代碼
package dreamtime .guestbook ; //指定類所在的包
import java .awt . * ; //導入類
import java .awt .image . * ;
import java .util . * ;
//定義類
public class VerifyCode {
static Random r = new Random ( ) ;
static String ssource = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz" + "0123456789" ;
static char [ ] src = ssource .toCharArray ( ) ;
//産生随機字元串
private static String randString ( int length ) {
char [ ] buf = new char [ length ] ;
int rnd ;
for ( int i =0 ;i < length ;i + + ) {
rnd = Math . abs (r .nextInt ( ) ) % src . length ;
buf [i ] = src [rnd ] ;
}
return new String (buf ) ;
}
//調用該方法,産生随機字元串
public String runVerifyCode ( int i ) {
String VerifyCode = randString (i ) ;
return VerifyCode ;
}
//給定範圍獲得随機顔色
public Color getRandColor ( int fc , int bc )
{
Random random = new Random ( ) ;
if (fc >255 ) fc =255 ;
if (bc >255 ) bc =255 ;
int r =fc + random .nextInt (bc -fc ) ;
int g =fc + random .nextInt (bc -fc ) ;
int b =fc + random .nextInt (bc -fc ) ;
return new Color (r ,g ,b ) ;
}
//調用該方法将得到的驗證碼生成圖象
//sCode:傳遞驗證碼 w:圖象寬度 h:圖象高度
public BufferedImage CreateImage ( String sCode )
{
//字元的字型
Font CodeFont = new Font ( "Arial Black" ,Font .PLAIN ,16 ) ;
int iLength = sCode . length ( ) ; //得到驗證碼長度
int width =24 *iLength , height =20 ; //圖象寬度與高度
int CharWidth = ( int ) ( width -24 ) /iLength ; //字元距左邊寬度
int CharHeight = 16 ; //字元距上邊高度
// 在記憶體中建立圖象
BufferedImage image = new BufferedImage ( width , height , BufferedImage .TYPE_INT_RGB ) ;
// 擷取圖形上下文
Graphics g = image .getGraphics ( ) ;
//生成随機類
Random random = new Random ( ) ;
// 設定背景色
g .setColor (getRandColor (200 ,240 ) ) ;
g .fillRect (0 , 0 , width , height ) ;
//設定字型
g .setFont (CodeFont ) ;
//畫随機顔色的邊框
g .setColor (getRandColor (10 ,50 ) ) ;
g .drawRect (0 ,0 , width -1 , height -1 ) ;
// 随機産生155條幹擾線,使圖象中的認證碼不易被其它程式探測到
g .setColor (getRandColor (160 ,200 ) ) ;
for ( int i =0 ;i <155 ;i + + )
{
int x = random .nextInt ( width ) ;
int y = random .nextInt ( height ) ;
int xl = random .nextInt (12 ) ;
int yl = random .nextInt (12 ) ;
g .drawLine (x ,y ,x +xl ,y +yl ) ;
}
for ( int i =0 ;i <iLength ;i + + )
{
String rand = sCode . substring (i ,i +1 ) ;
// 将認證碼顯示到圖象中
g .setColor ( new Color (20 + random .nextInt (60 ) ,20 + random .nextInt (120 ) ,20 + random .nextInt (180 ) ) ) ;
g .drawString (rand ,CharWidth *i +14 ,CharHeight ) ;
}
// 圖象生效
System .out . print (CharWidth ) ;
g .dispose ( ) ;
return image ;
}
//測試
public static void main ( String [ ] args ) {
VerifyCode vc = new VerifyCode ( ) ;
String s1 = vc .runVerifyCode (4 ) ;
System .out .println (s1 ) ;
//Image im = vc.CreateImage(s1);
//Graphics g = im.getGraphics();
//g.drawImage(im,20,20,this);
//g.drawString(s1,20,20);
}
}
[ /code ][/color]