程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP生成gif動態驗證碼圖片

PHP生成gif動態驗證碼圖片

編輯: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.="!37713NETSCAPE2.031".GIFEncoder::GIFWord($this->LOP)."";
  }
  }
  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="!xF9x04".chr(($this->DIS<<2)+0).chr(($d>>0)&0xFF).chr(($d>>8)&0xFF)."x0x0";
  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="!xF9x04".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動 *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved