PHP实现GIF图片验证码
这是一个用PHP生成GIF动画来实现动态图片验证码的程序,非常实用,是php用户注册登录界面经常需要用到的验证码程序,有需要GIF动态图片验证码功能的朋友可以收藏一下。
第一步:创建ImageCode.php文件,验证码生成函数代码如下:
<?php /** *ImageCode生成GIF图片验证 *@param$string字符串 *@param$width宽度 *@param$height高度 **/ functionImageCode($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; //生成一个32帧的GIF动画 for($i=0;$i<32;$i++) { ob_start(); $image=imagecreate($board_width,$board_height); imagecolorallocate($image,0,0,0); //设定文字颜色数组 $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); $color2=imagecolorallocate($image,255,0,0); imagefill($image,0,0,$gray); $space=15;//字符间距 if($i>0)//屏蔽第一帧 { for($k=0;$k<strlen($authstr);$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]); } //添加干扰线 for($k=0;$k<3;$k++) { $colorRandom=mt_rand(0,sizeof($colorList)-1); //$todrawline=rand(0,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=newGIFEncoder($imagedata); Header('Content-type:image/gif'); echo$gif->GetAnimation(); } /** *GIFEncoder类 **/ ClassGIFEncoder { var$GIF="GIF89a";/*GIFheader6bytes*/ var$VER="GIFEncoderV2.06";/*Encoderversion*/ var$BUF=Array(); var$LOP=0; var$DIS=2; var$COL=-1; var$IMG=-1; var$ERR=Array( 'ERR00'=>"Doesnotsupportedfunctionforonlyoneimage!", 'ERR01'=>"SourceisnotaGIFimage!", 'ERR02'=>"Unintelligibleflag", 'ERR03'=>"CouldnotmakeanimationfromanimatedGIFsource", ); functionGIFEncoder($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<<(ord($this->BUF[$i]{10})&0x07))),$k=TRUE;$k;$j++) { switch($this->BUF[$i]{$j}) { case"!": if((substr($this->BUF[$i],($j+3),8))=="NETSCAPE") { printf("%s:%s(%ssource)!",$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(); } functionGIFAddHeader() { $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)."\0"; } } functionGIFAddFrames($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})&0x07))); $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})&0x07));$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; } functionGIFAddFooter(){ $this->GIF.=";"; } functionGIFBlockCompare($GlobalBlock,$LocalBlock,$Len) { for($i=0;$i<$Len;$i++) { if($GlobalBlock{3*$i+0}!=$LocalBlock{3*$i+0}||$GlobalBlock{3*$i+1}!=$LocalBlock{3*$i+1}||$GlobalBlock{3*$i+2}!=$LocalBlock{3*$i+2}) { return(0); } } return(1); } functionGIFWord($int) { return(chr($int&0xFF).chr(($int>>8)&0xFF)); } functionGetAnimation() { return($this->GIF); } }
第二步:验证码生成,创建yzimg.php,并引用入文件ImageCode.php。代码如下:
<?php if(!isset($_SESSION)){ session_start(); } require_once(dirname(__FILE__)."ImageCode.php"); unset($_SESSION['yzm']); $randCode=''; $chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789'; for($i=0;$i<4;$i++) { $randCode.=substr($chars,mt_rand(0,strlen($chars)-1),1); } $_SESSION['yzm']=$randCode;//记录session ImageCode($randCode,60); /*方法二*/ /*$authstr=mt_rand(1000,9999);//生成随机字符串 $_SESSION['yzm']=$authstr;//记录session ImageCode($authstr,60);//显示GIF动画*/ ?>
第三步:调用和显示验证码,在需要添加验证码的页面加入以下代码,代码如下:
<inputname="yzm"type="text"class="input1"size="12"style="width:70px;"/> <SCRIPTLANGUAGE="JavaScript"> <!-- document.write('<imgid="yz_Img"name="imageField"class="yz_Img"title="刷新验证码"onclick="this.src=this.src+Math.random();"src="yzimg.php?'+Math.random()+'">'); //--> </SCRIPT>
以上就是为大家分享的如何使用php生成动态验证码的相应代码,希望对大家的学习有所帮助。