微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php生成动态验证码gif图片

这是一个通过PHP生成的动态验证码图片的示例,重点是可以运行哦!下面先发下效果图:

下面是PHP生成动态验证码需要用到的相关类和函数

rush: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); // 设定文字颜色数组 $colorList[]=ImageColorAllocate($image,15,73,210); $colorList[]=ImageColorAllocate($image,64,0); $colorList[]=ImageColorAllocate($image,64); $colorList[]=ImageColorAllocate($image,128,128); $colorList[]=ImageColorAllocate($image,27,52,47); $colorList[]=ImageColorAllocate($image,51,102); $colorList[]=ImageColorAllocate($image,145); $colorList[]=ImageColorAllocate($image,113); $colorList[]=ImageColorAllocate($image,51); $colorList[]=ImageColorAllocate($image,158,180,35); $colorList[]=ImageColorAllocate($image,59,59); $colorList[]=ImageColorAllocate($image,1,180); $colorList[]=ImageColorAllocate($image,153,60,131,1); $colorList[]=ImageColorAllocate($image,0); $fontcolor=ImageColorAllocate($image,0); $gray=ImageColorAllocate($image,245,245); $color=imagecolorallocate($image,255,255); $color2=imagecolorallocate($image,0); imagefill($image,$gray); $space=15;// 字符间距 if($i>0){// 屏蔽第一帧 $top=0; for($k=0;$kimagesetpixel($image,rand()%70,rand()%15,$colorList[$colorRandom]);
} 
// <a href="https://www.jb51.cc/tag/tianjia/" target="_blank" class="keywords">添加</a>干扰线 
for($k=0;$k<3;$k++){ 
  $colorRandom=mt_rand(0,sizeof($colorList)-1); 
  $todrawline=1; 
  if($todrawline){ 
    imageline($image,mt_rand(0,$board_width),$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,$GIFlop=0,$GIFdis=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("<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>: <a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>(<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>)!",$this->ERR [ 'ERR02' ],$GIF_mod); 
    exit(0); 
  }  
  if(substr($this->BUF[$i],6)!="GIF87a"&&substr($this->BUF [$i],6)!="GIF89a"){ 
    printf("<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>: %d <a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>",$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))=="<a href="https://www.jb51.cc/tag/netscape/" target="_blank" class="keywords">netscape</a>"){ 
            printf("<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>: <a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a>(<a href="https://www.jb51.cc/tag/s/" target="_blank" class="keywords">%s</a> source)!",$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],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],3(2<<(ord($this->BUF[0]{10})&0x07)));
$Locals_rgb=substr($this->BUF[$i],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,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生成动态验证码用法示例:

rush:PHP;"> /*调用示例*/ session_start(); $checkCode=''; $chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPRSTUVWXYZ23456789'; for($i=0;$i<4;$i++){ $checkCode.=substr($chars,strlen($chars)-1),1); } $_SESSION['code']=strtoupper($checkCode);// 记录session ImageCode($checkCode,60);// 显示GIF动画

以上就是PHP如何生成动态验证码的实现方法,希望对大家的学习有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中NATIVE的支付实现流程与PC端实现扫码支付流程
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中APP的支付的配置与实现流程
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户信息这个功能的开发流程。 配置 1.首先得在微信公众平台申请一下微信小程序账号并获取到小程序的AppID和AppSecret https://mp.weixin.qq.com/cgi-bin/loginpage?url=%2Fwxamp%2F
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一款开源且免费商用的后台开发框架,它基于ThinkPHP和Bootstrap两大主流技术构建的极速后台开发框架,它有着非常完善且强大的功能和便捷的开发体验,使我逐渐喜欢上了它。
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛,就离不开通讯了,然后我就想到了长连接。这里本人用的是GatewayWorker框架。
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返回预支付订单号的接口,目前微信支付所有场景均使用这一接口。下面介绍的是其中JSAPI的支付实现流程
服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用