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生成动态验证码的相应代码,希望对大家的学习有所帮助。