php生成动态验证码gif图片


Posted in PHP onOctober 19, 2015

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

php生成动态验证码gif图片

下面是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如何生成动态验证码的实现方法,希望对大家的学习有所帮助。

PHP 相关文章推荐
第十节--抽象方法和抽象类
Nov 16 PHP
mysql limit查询优化分析
Nov 12 PHP
一个简单的php加密解密函数(动态加密)
Jun 19 PHP
ThinkPHP3.1.3版本新特性概述
Jun 19 PHP
Symfony数据校验方法实例分析
Jan 26 PHP
PHP实现获取客户端IP并获取IP信息
Mar 17 PHP
PHP实现在线阅读PDF文件的方法
Jun 23 PHP
CodeIgniter分页类pagination使用方法示例
Mar 28 PHP
PHP实现的下载远程文件类定义与用法示例
Jul 05 PHP
php批量转换文件夹下所有文件编码的函数类
Aug 06 PHP
thinkPHP5分页功能实现方法分析
Oct 25 PHP
PHP判断一个变量是否为整数、正整数的方法示例
Sep 11 PHP
php批量删除超链接的实现方法
Oct 19 #PHP
php二维码生成
Oct 19 #PHP
部署PHP时的4个配置修改说明
Oct 19 #PHP
PHP代码判断设备是手机还是平板电脑(两种方法)
Oct 19 #PHP
基于PHP实现假装商品限时抢购繁忙的效果
Oct 16 #PHP
php如何连接sql server
Oct 16 #PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 #PHP
You might like
ASP知识讲座四
2006/10/09 PHP
php5 mysql分页实例代码
2008/04/10 PHP
深入PHP数据缓存的使用说明
2013/05/10 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
javascript 上下banner替换具体实现
2013/11/14 Javascript
用javascript读取xml文件读取节点数据
2014/08/12 Javascript
javascript工厂方式定义对象
2014/12/26 Javascript
详解Bootstrap插件
2016/04/25 Javascript
json格式的javascript对象用法分析
2016/07/04 Javascript
AngularJS利用Controller完成URL跳转
2016/08/09 Javascript
解决微信内置浏览器返回上一页强制刷新问题方法
2017/02/05 Javascript
基于bootstrap实现bootstrap中文网巨幕效果
2017/05/02 Javascript
backbone简介_动力节点Java学院整理
2017/07/14 Javascript
vue使用 better-scroll的参数和方法详解
2018/01/25 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
JS中的算法与数据结构之集合(Set)实例详解
2019/08/20 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
Python3里的super()和__class__使用介绍
2015/04/23 Python
批量将ppt转换为pdf的Python代码 只要27行!
2018/02/26 Python
Python代码太长换行的实现
2019/07/05 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
pandas DataFrame运算的实现
2020/06/14 Python
python正则表达式re.match()匹配多个字符方法的实现
2021/01/27 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
墨尔本照明批发商店:Mica Lighting
2017/12/28 全球购物
如何提高JDBC的性能
2013/04/30 面试题
为什么UNION ALL比UNION快
2016/03/17 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
2014年元旦活动方案
2014/02/15 职场文书
考察邀请函范文
2015/01/31 职场文书
河童之夏观后感
2015/06/11 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
世界文化遗产导游词
2019/08/07 职场文书