php生成动态验证码gif图片
程序员文章站
2023-11-25 11:48:28
这是一个通过php生成的动态验证码图片的示例,重点是可以运行哦!下面先发下效果图:
下面是php生成动态验证码需要用到的相关类和函数。
<...
这是一个通过php生成的动态验证码图片的示例,重点是可以运行哦!下面先发下效果图:
下面是php生成动态验证码需要用到的相关类和函数。
<?php /** *imagecode 生成包含验证码的gif图片的函数 *@param $string 字符串 *@param $width 宽度 *@param $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; // 生成一个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){// 屏蔽第一帧 $top=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=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 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<<(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(%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)."\0"; } } 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})&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; } function gifaddfooter(){ $this->gif.=";"; } function gifblockcompare($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); } function gifword($int){ return(chr($int&0xff).chr(($int>>8)&0xff)); } function getanimation(){ return($this->gif); } }
php生成动态验证码用法示例:
/*调用示例*/ 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);// 记录session imagecode($checkcode,60);// 显示gif动画
以上就是php如何生成动态验证码的实现方法,希望对大家的学习有所帮助。
下一篇: Cool n Quiet2.0 技术介绍