Home>

This is a program that uses php to generate gif animations to implement dynamic image verification codes.Very practical,It is a verification code program that is often used by the php user registration and login interface.Friends who need the gif dynamic picture verification code function can bookmark it.

Step 1:Create the imagecode.php file. The verification code generation function code is as follows:

<?php
/**
 * imagecode generates gif image verification
 * @param $string string
 * @param $width width
 * @param $height 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;
  //Generate a 32 frame gif animation
  for ($i=0;$i<32;$i ++)
  {
    ob_start ();
    $image=imagecreate ($board_width, $board_height);
    imagecolorallocate ($image, 0,0,0);
    //Set text color array
    $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;//character spacing
    if ($i>0) //mask the first frame
    {
      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]);
    }
    //add interference line
    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=new gifencoder ($imagedata);
  header ("content-type:image/gif");
  echo $gif->getanimation ();
}
/**
 * gifencoder class
 * * /
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- & gt;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 > gt>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);
  }
}

Step 2:Verification code generation,Create yzimg.php and reference the file imagecode.php. code show as below:

<?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;//record session
imagecode ($randcode, 60);
/*Method Two*/
/* $authstr=mt_rand (1000, 9999);//generate a random string
$_session ["yzm"]=$authstr;//record session
imagecode ($authstr, 60);//show gif animation * /
?>

Step 3:Call and display the verification code,Add the following code on the page where you need to add a verification code,code show as below:

<input name="yzm" type="text" size="12" />
         <script language="javascript">
<!-
document.write ("<img name =" imagefield "onclick =" this.src=this.src+ math.random ();"src =" yzimg.php?"+ math.random () +" "">");
//->
</script>
php
  • Previous Mysql command Daquan (detailed)
  • Next C # Cinema Ticketing System Graduation Design (2)