首页 > 代码库 > 验证码验证实例

验证码验证实例

技术分享
  1 <?PHP
  2 /**
  3  * 验证码类
  4  */
  5  class VerificationCode
  6  {
  7      private $code;                //验证码内容
  8     private $codelen=4;            //验证码长度
  9     private $width=130;            //图片宽度
 10     private $height=50;            //图片高度
 11     private $img;                //图形资源句柄
 12     private $font="impact.ttf";//指定的字体
 13     private $fontsize=25;        //指定字体大小
 14     private $type=2;            //验证码内容模式
 15     private $dotNum=800;        //噪点数
 16     private $lineNum=20;        //干扰线数
 17 ////////////////////生成验证码内容////////////////////
 18      private function randomCode()
 19     {
 20         $number="0123456789";
 21         $lowercaseLetters="qwertyuiopasdfghjklzxcvbnm";
 22         $capitalLetter="QWERTYUIOPASDFGHJKLZXCVBNM";
 23         switch ($this->type) //根据type设置验证码样本str
 24         {
 25             case 0://纯数字
 26                 $str=$number;
 27                 break;
 28             case 1://纯字母
 29                 $str=$lowercaseLetters.$capitalLetter;
 30                 break;
 31             case 2://数字+小写字母
 32                 $str=$number.$lowercaseLetters;
 33                 break;
 34             case 3://数字+字母
 35                 $str=$number.$lowercaseLetters.$capitalLetter;
 36                 break;
 37         }
 38         $code="";
 39         for ($i=0;$i<$this->codelen;$i++) 
 40             $code.=$str[rand(0,strlen($str)-1)];
 41         $this->code=$code;
 42     }
 43 ////////////////////获取随机颜色(较深)////////////////////
 44     private function randomColor()
 45     {
 46         return imagecolorallocate($this->img,rand(0,200),rand(0,200),rand(0,200));
 47     }
 48 ////////////////////绘制画布////////////////////
 49     private function createBg() 
 50     {
 51         /*resource imagecreatetruecolor(int $width,int $height)
 52         *新建一个大小为width*height的真彩色图像,返回图像标识符
 53         */
 54           $this->img=imagecreatetruecolor($this->width,$this->height);
 55           /*int imagecolorallocate(resource $image,int $red,int $green,int $blue)
 56           *返回一个标识符,代表了由给定的 RGB 成分组成的颜色。失败返回-1.
 57           *red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。
 58           这些参数是 0 到 255 的整数或者十六进制的 0x00 到 0xFF。
 59           */
 60           $bg=imagecolorallocate($this->img,rand(157,255),rand(157,255),rand(157,255));
 61           /*bool imagefill(resource $image,int $x,int $y,int $color)
 62           *在image图像的坐标x,y处(图像左上角为 0,0)用color颜色执行区域填充(即与x, y点颜色相同且相邻的点都会被填充)。
 63           */
 64           imagefill($this->img,0,0,$bg);
 65      }
 66  ////////////////////绘制噪点和干扰线////////////////////noise
 67      private function createNoise() 
 68      {
 69          /*bool imagesetpixel(resource $image,int $x,int $y,int $color)
 70          *在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。
 71          */
 72          for ($i=0;$i<$this->dotNum;$i++)
 73             imagesetpixel($this->img,rand(0,$this->width),rand(0,$this->height),$this->randomColor());
 74         /*bool imageline(resource $image,int $x1,int $y1,int $x2,int $y2,int $color)
 75         *用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。
 76         */
 77         for ($i=0; $i <5 ; $i++)
 78             imageline($this->img,rand(0,$this->width),rand(0,$this->height),rand(0,$this->width),rand(0,$this->height),$this->randomColor());
 79      }
 80  ////////////////////绘制验证码////////////////////
 81      private function createFont() 
 82      {
 83          /*array imagettftext(resource $image,float $size,float $angle,int $x,int $y,int $color,string $fontfile,string $text)
 84          *使用 TrueType 字体将 指定的text写入图像image。 
 85          *image,由图象创建函数(例如 imagecreatetruecolor() )返回的图象资源。
 86          *size,字体的尺寸。
 87          *angle,角度制表示的角度,0 度为从左向右读的文本。更高数值表示逆时针旋转。例如 90 度表示从下向上读的文本。 
 88          *x和y,表示的坐标定义了第一个字符的基本点(大概是字符的左下角)。
 89          *color,颜色索引。
 90          *fontfile,想要使用的 TrueType 字体的路径。
 91          *text,UTF-8 编码的文本字符串。 
 92          */
 93          for ($i=0;$i<$this->codelen;$i++) 
 94          {
 95              $randomFZ=rand($this->fontsize,$this->fontsize+10);
 96              $randomAngle=rand(-40,40);
 97              $x=20+$this->fontsize*$i;
 98              $y=40;
 99              $fontcolor=imagecolorallocate($this->img,rand(0,156),rand(0,156),rand(0,156));
100             imagettftext($this->img,$randomFZ,$randomAngle,$x,$y,$fontcolor,$this->font,$this->code[$i]);
101          }
102      }
103  ////////////////////输出图像并释放内存////////////////////
104      private function outPut()
105      {
106          /*输出png格式图像*/
107          header("Content-Type:image/png");
108          /*bool imagepng(resource $image[,string $filename])
109          *将 GD 图像流(image)以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。
110          */
111         imagepng($this->img);
112         /*bool imagedestroy(resource $image)
113         *释放与 image 关联的内存。
114         */
115         imagedestroy($this->img);
116      }
117  ////////////////////生成完整二维码////////////////////
118      public  function getvc()
119      {
120          $this->createBg();//生成画布
121           $this->randomCode();//生成验证码
122           $this->createFont();//绘制验证码
123           $this->createNoise();//绘制噪点和干扰线
124           $this->outPut();//输出图像并释放内存
125      }
126  ////////////////////获取验证码答案////////////////////
127      public  function getCode()
128      {
129          return $this->code;
130      }
131  } 
132 ?>
验证码封装类VerificationCode.class.php
技术分享
 1 <?PHP 
 2     /*
 3     *创建VerificationCode的实例对象,生成验证码图片并将正确答案存入session
 4     */
 5     session_start();
 6     require_once "VerificationCode.class.php";
 7     $verificationCode=new VerificationCode();
 8     $verificationCode->getvc();
 9     $_SESSION["VerificationCode"] = $verificationCode->getCode();
10 ?>
captcha.php
技术分享
 1 <?PHP 
 2     /*获取验证码答案*/
 3     session_start();
 4     if (isset($_SESSION[‘VerificationCode‘])) {
 5         $VerificationCode=$_SESSION[‘VerificationCode‘];
 6     } else {
 7         die("获取验证码答案失败!!");
 8     }
 9 ?>
10 <html>
11     <head>
12         <title>图片验证实例</title>
13         <meta http-equiv = "content-type" content="text/html; charset = utf-8 " >
14     </head> 
15     <body> 
16         <form action="" method="post">
17             <p>
18                 <!--验证码-->
19                 <img  title="点击更换" src="http://www.mamicode.com/captcha.php" align="absbottom" onclick="this.src=http://www.mamicode.com/‘captcha.php?‘+Math.random();"></img>
20                 <input type="text" name="validate" value="" size=10> 
21                 <DIV class="error"><?PHP 
22                     $validate="";
23                     if(isset($_POST["validate"]))
24                     {
25                         $validate=$_POST["validate"];
26                         echo "您刚才输入的是:".$_POST["validate"]."<br>";
27                         echo "正&nbsp确&nbsp答&nbsp案&nbsp是:".$VerificationCode."<br>";
28                         if($validate!=$VerificationCode)
29                             echo "<font color=red>输入有误</font>"; 
30                         else
31                             echo "<font color=green>通过验证</font>"; 
32                     } 
33                 ?></DIV>
34             </p>
35             <p><input type="submit" value="http://www.mamicode.com/确定"></p>
36         </form>
37     </body>
38 </html>
mainview.php

技术分享

技术分享

技术分享

 

验证码验证实例