Send a real-running example of a dynamic CAPTCHA image generated by PHP. Online Download a lot of error, so I integrated all aspects of the views, and finally completed such an effect.
Here are the related classes and functions that PHP needs to generate the dynamic verification code.
/**
*imagecode a function to generate a GIF picture containing a CAPTCHA
* @param $string string
* @param $width width
* @param $height Height
**/
function Imagecode ($string = ", $width =75, $height =25) {
$authstr = $string? $string:((Time ()%2==0) Mt_rand (1000,9999): Mt_rand (10000,99999));
$board _width= $width;
$board _height= $height;
Generate a 32-frame GIF animation
for ($i =0; $i <32; $i + +) {
Ob_start ();
$image =imagecreate ($board _width, $board _height);
Imagecolorallocate ($image, 0,0,0);
Set Text color array
$colorList []=imagecolorallocate ($image, 15,73,210);
$colorList []=imagecolorallocate ($image, 0,64,0);
$colorList []=imagecolorallocate ($image, 0,0,64);
$colorList []=imagecolorallocate ($image, 0,128,128);
$colorList []=imagecolorallocate ($image, 27,52,47);
$colorList []=imagecolorallocate ($image, 51,0,102);
$colorList []=imagecolorallocate ($image, 0,0,145);
$colorList []=imagecolorallocate ($image, 0,0,113);
$colorList []=imagecolorallocate ($image, 0,51,51);
$colorList []=imagecolorallocate ($image, 158,180,35);
$colorList []=imagecolorallocate ($image, 59,59,59);
$colorList []=imagecolorallocate ($image, 0,0,0);
$colorList []=imagecolorallocate ($image, 1,128,180);
$colorList []=imagecolorallocate ($image, 0,153,51);
$colorList []=imagecolorallocate ($image, 60,131, 1);
$colorList []=imagecolorallocate ($image, 0,0,0);
$fontcolor =imagecolorallocate ($image, 0,0,0);
$gray =imagecolorallocate ($image, 245,245,245);
$color =imagecolorallocate ($image, 255,255,255);
$color 2=imagecolorallocate ($image, 255,0,0);
Imagefill ($image, 0,0, $gray);
$space =15;//Character Spacing
if ($i >0) {//Mask First frame
$top = 0;
for ($k =0; $k
$colorRandom =mt_rand (0,sizeof ($colorList)-1);
$float _top=rand (0,4);
$float _left=rand (0,3);
Imagestring ($image, 6, $space * $k, $top + $float _top,substr ($authstr, $k, 1), $colorList [$colorRandom]);
}
}
for ($k =0; $k <20; $k + +) {
$colorRandom =mt_rand (0,sizeof ($colorList)-1);
Imagesetpixel ($image, Rand ()%70,rand ()%15, $colorList [$colorRandom]);
}
Adding interference lines
for ($k =0; $k <3; $k + +) {
$colorRandom =mt_rand (0,sizeof ($colorList)-1);
$todrawline = 1;
if ($todrawline) {
Imageline ($image, Mt_rand (0, $board _width), Mt_rand (0, $board _height), Mt_rand (0, $board _width), Mt_rand (0, $board _ height), $colorList [$colorRandom]);
}else{
$w =mt_rand (0, $board _width);
$h =mt_rand (0, $board _width);
Imagearc ($image, $board _width-floor ($w/2), Floor ($h/2), $w, $h, Rand (90,180), Rand (180,270), $colorList [$colorRandom] );
}
}
Imagegif ($image);
Imagedestroy ($image);
$imagedata []=ob_get_contents ();
Ob_clean ();
+ + $i;
}
$gif =new Gifencoder ($imagedata);
Header (' content-type:image/gif ');
echo $gif->getanimation ();
}
/**
*gifencoder class
**/
Class gifencoder{
var $GIF = "gif89a"; /* GIF Header 6 bytes */
var $VER = "Gifencoder V2.06"; /* Encoder version */
var $BUF =array ();
var $LOP = 0;
var $DIS = 2;
var $COL =-1;
var $IMG =-1;
var $ERR =array (
' ERR00 ' = ' Does not supported function for only one image! ',
' ERR01 ' = ' Source is not a GIF image! ',
' ERR02 ' = ' unintelligible flag ',
' ERR03 ' = ' Could not make animation from animated GIF source ',
);
function Gifencoder ($GIF _src, $GIF _dly=100, $GIF _lop=0, $GIF _dis=0, $GIF _red=0, $GIF _grn=0, $GIF _blu=0, $GIF _mod= ' bin ' ){
if (!is_array ($GIF _src) &&!is_array ($GIF _tim)) {
printf ("%s:%s", $this->ver, $this->err[' ERR00 ']);
Exit (0);
}
$this->lop= ($GIF _lop>-1)? $GIF _lop:0;
$this->dis= ($GIF _dis>-1)? (($GIF _dis<3)? $GIF _dis:3): 2;
$this->col= ($GIF _red>-1&& $GIF _grn>-1&& $GIF _blu>-1)? ($GIF _red | ($GIF _grn<<8) | ($GIF _blu<<16)):-1;
For ($i =0, $src _count=count ($GIF _src); $i < $src _count; $i + +) {
if (Strtolower ($GIF _mod) = = "url") {
$this->buf[]=fread (fopen ($GIF _src [$i], "RB"), FileSize ($GIF _src [$i]));
}elseif (Strtolower ($GIF _mod) = = "Bin") {
$this->buf []= $GIF _src [$i];
}else{
printf ("%s:%s (%s)!", $this->ver, $this->err [' ERR02 '], $GIF _mod);
Exit (0);
}
if (substr ($this->buf[$i],0,6)! = "gif87a" &&substr ($this->buf [$i],0,6)! = "gif89a") {
printf ("%s:%d%s", $this->ver, $i, $this->err [' ERR01 ']);
Exit (0);
}
for ($j = (13+3* (2<< ($this->buf[$i]{10})), $k &0x07; $k; $j + +) {
Switch ($this->buf [$i]{$j}) {
Case "!":
if ((substr ($this->buf[$i], ($j +3), 8) = = "NETSCAPE") {
printf ("%s:%s (%s source)!", $this->ver, $this->err [' ERR03 '], ($i + 1));
Exit (0);
}
Break
Case ";":
$k =false;
Break
}
}
}
Gifencoder::gifaddheader ();
For ($i =0, $count _buf=count ($this->buf); $i < $count _buf; $i + +) {
Gifencoder::gifaddframes ($i, $GIF _dly[$i]);
}
Gifencoder::gifaddfooter ();
}
function Gifaddheader () {
$cmap = 0;
if (Ord ($this->buf[0]{10}) &0x80) {
$cmap =3* (2<< (Ord ($this->buf [0]{10}) &0x07));
$this->gif.=substr ($this->buf [0],6,7);
$this->gif.=substr ($this->buf [0],13, $cmap);
$this->gif.= "!\377\13netscape2.0\3\1". Gifencoder::gifword ($this->lop). " ";
}
}
function Gifaddframes ($i, $d) {
$Locals _str=13+3* (2 << (ord ($this->buf[$i]{10) &0x07));
$Locals _end=strlen ($this->buf[$i])-$Locals _str-1;
$Locals _tmp=substr ($this->buf[$i], $Locals _str, $Locals _end);
$Global _len=2<< (Ord ($this->buf [0]{10}) &0x07);
$Locals _len=2<< (Ord ($this->buf[$i]{10}) &0x07);
$Global _rgb=substr ($this->buf[0],13,3* (2<< (Ord ($this->buf[0]{10) &0x07));
$Locals _rgb=substr ($this->buf[$i],13,3* (2<< (Ord ($this->buf[$i]{10})));
$Locals _ext= "!\xf9\x04". Chr (($this->dis<<2) +0). Chr (($d >>0) &0xff). Chr (($d >>8) &0xff )." \x0\x0 ";
if ($this->col>-1&&ord ($this->buf[$i]{10}) (&0x80) {
for ($j =0; $j < (2<< (Ord ($this->buf[$i]{10})); $j + +) {
if (Ord ($Locals _rgb{3* $j +0}) = = ($this->col>> 0) &0xff&&ord ($Locals _rgb{3* $j +1}) = = ($this Col>> 8) &0xff&&ord ($Locals _rgb{3* $j +2}) = = ($this->col>>16) &0xff) {
$Locals _ext= "!\xf9\x04". Chr (($this->dis<<2) +1). Chr (($d >>0) &0xff). Chr (($d >>8) &0xff ). chr ($j). " \x0 ";
Break
}
}
}
Switch ($Locals _tmp{0}) {
Case "!":
$Locals _img=substr ($Locals _tmp,8,10);
$Locals _tmp=substr ($Locals _tmp,18,strlen ($Locals _tmp)-18);
Break
Case ",":
$Locals _img=substr ($Locals _tmp,0,10);
$Locals _tmp=substr ($Locals _tmp,10,strlen ($Locals _tmp)-10);
Break
}
if (Ord ($this->buf[$i]{10}) &0x80&& $this->img>-1) {
if ($Global _len== $Locals _len) {
if (Gifencoder::gifblockcompare ($Global _rgb, $Locals _rgb, $Global _len)) {
$this->gif.= ($Locals _ext. $Locals _img. $Locals _tmp);
}else{
$byte =ord ($Locals _img{9});
$byte |=0x80;
$byte &=0xF8;
$byte |= (Ord ($this->buf [0]{10}) &0x07);
$Locals _IMG{9}=CHR ($byte);
$this->gif.= ($Locals _ext. $Locals _img. $Locals _rgb. $Locals _tmp);
}
}else{
$byte =ord ($Locals _img{9});
$byte |=0x80;
$byte &=0xF8;
$byte |= (Ord ($this->buf[$i]{10}) &0x07);
$Locals _img {9}=CHR ($byte);
$this->gif.= ($Locals _ext. $Locals _img. $Locals _rgb. $Locals _tmp);
}
}else{
$this->gif.= ($Locals _ext. $Locals _img. $Locals _tmp);
}
$this->img=1;
}
function Gifaddfooter () {
$this->gif.= ";";
}
function Gifblockcompare ($GlobalBlock, $LocalBlock, $Len) {
for ($i =0; $i < $Len; $i + +) {
if ($GlobalBlock {$i +0}!= $LocalBlock {+0}| $i | $GlobalBlock {$i +1}!= $LocalBlock {$i +1}| | $GlobalBlock {$i +2}!= $LocalBlock {$i +2}) {
return (0);
}
}
return (1);
}
function Gifword ($int) {
Return (Chr ($int &0xff). Chr (($int >>8) &0xff);
}
function Getanimation () {
Return ($this->gif);
}
}
Example of PHP generated dynamic CAPTCHA usage:
/* Invoke Example */
Session_Start ();
$checkCode = ";
$chars = ' abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789 ';
for ($i =0; $i <4; $i + +) {
$checkCode. =substr ($chars, Mt_rand (0,strlen ($chars)-1), 1);
}
$_session[' Code ']=strtoupper ($checkCode);//Record SESSION
Imagecode ($checkCode, 60);//Display GIF animation