当前位置 : 主页 > 网络编程 > PHP >

php验证码|php图片验证码|php image.verifyCode.class.php

来源:互联网 收集:自由互联 发布时间:2021-07-03
临时弄了一个图片验证码,不过那条线没有处理的很好,位置固定的,应该跟随字符变化的,求改进呀~~~ 还有就是最好写成类的方式,不用过程的。。。 验证的时候只需要对比$_SESSI
临时弄了一个图片验证码,不过那条线没有处理的很好,位置固定的,应该跟随字符变化的,求改进呀~~~

还有就是最好写成类的方式,不用过程的。。。

验证的时候只需要对比$_SESSION['VerifyCode']就可以了。。。

//===================================================================//

如果不放session里,可以生成一个token作为验证码的查询key,再把对应key的vlaue存放在mysql或者memcache里,在表单里传递token过来后,查询验证。。。

//==================================================================//

最下面提供了一个较完整的verifyCode.class.php的验证码类,是几年前写的了,可以看下下。。。。。。

1. [代码][PHP]代码    

<?php
session_start();

//=====================================================================//
$width = 120;
$height = 50;
$point = 200;
$size = 25;
$line = 9;
$offset = 10;
$font = 'Consolab.ttf';
$code = mt_rand(1111, 9999);
$_SESSION['VerifyCode'] = md5($code);
//=====================================================================//

$img = imagecreate($width, $height);
$back = imagecolorallocate($img, 255, 220, 230);
$color = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255));
$list = str_split(strval($code));
foreach($list as $key => $value){
	$angle = mt_rand(-60, 60);
	imagettftext($img, $size, $angle, $key*$size+$offset, $key+$size+$offset, $color, $font, $value);	
}
for($i = 1; $i < $point; $i ++){
	imagesetpixel($img, rand()%$width, rand()%$height, $color);	
}
for($j = 1; $j < $line; $j ++){
	imageline($img, $line-$j, $size-$j, $width-$line-$j, $height-$line-$j,  $color);
}

header('Content-type: image/png');
print imagepng($img);

2. [图片] QQ截图20150206164721.png    

3. [代码][PHP]代码    

<?php
header("Cache-Control:no-cache");
header("Pragma:no-cache");

session_start();

class verifyCode{
    private $img;
    private $code;
    private $imgBg;
    private $randColor;
    private $codeArray;
    private $fontAngle;
    private $fontText;
    private $imgType="png";      // "gif"  "jpeg"  "png"  "wbmp"
    private $imgWidth=120;      //图像宽度
    private $imgHeight=40;      //图像高度
    private $fontSize=22;       //字体大小
    private $fontNum=5;             // 验证码字体(字符)个数
    private $fontType="Arial.ttf";           // 字体类型
    private $fontOutType=2;       // 1  表示全为数字验证码(需要进行加密判断), 2 表示数字与字母混合型验证码 (需要进行加密判断) 
    private $pointNum=250;      //噪声点个数
    private $pointX=120;    //一般设置为与图像宽度相同
    private $pointY=50;     //一般设置为与图像高度相同
    private $lineNum=10;         //噪声线条个数 
    private $lineX1=array(0,1);            //噪声线X轴范围
    private $lineY1=array(0,50);            //噪声线Y轴范围
    private $lineX2=array(100,150);
    private $lineY2=array(0,50);
    private $xx;            //字符写入图像时的基量
    private $xxx=20;        //字符写入图像时的增量
    private $yy;
    private $yyy=6;


    function __construct(){
        if(! function_exists("gd_info")){
            die("gd was not found!");
        }
    }
        
     private function setImg(){
        $this->img=imagecreate($this->imgWidth,$this->imgHeight);
        $this->imgBg=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
        $this->randColor=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
       	self::writeImg();
        return $this->img;
    }
    
     private function randCode(){
        if($this->fontOutType==1){
            for($l=0;$l<$this->fontNum;$l++){
                $this->code.=substr(strval(mt_rand()),0,1);
            }
            $_SESSION["code"]=md5($this->code);
        }
        if($this->fontOutType==2){
            $this->codeArray=str_split("0aAb1BcC2dDe3EfF4gGh5HiI6jJk7KlL8mMn9NoO8pPq7QrR6sSt5TuU4vVw3WxX2yYz1Z0");
            for($h=0;$h<$this->fontNum;$h++){
                $this->code.=strval($this->codeArray[rand(0,70)]);
            }
            $_SESSION["code"]=md5($this->code);
        }
        return $this->code;
    }
    
     private function writeText(){
        $this->fontAngle=rand(-25,25);
        $this->fontText=str_split(self::randCode());
        $this->xx=intval($this->imgWidth/$this->fontNum)-$this->xxx/2;
        $this->yy=intval($this->imgHeight/2);
        for($m=0;$m<$this->fontNum;$m++){$this->randColor=imagecolorallocate($this->img,rand(0,255),rand(0,255),rand(0,255));
        imagettftext($this->img,$this->fontSize,$this->fontAngle,$this->xx+$this->xxx*$m,$this->yy+$this->yyy,$this->randColor,$this->fontType, $this->fontText[$m]);
     }
 }
    
     private function writeImg(){
        for($i=0;$i<$this->pointNum;$i++){
            imagesetpixel($this->img,rand()%$this->pointX,rand()%$this->pointY,$this->randColor);
        }
        for($j=0;$j<$this->lineNum;$j++){
            imageline($this->img,rand($this->lineX1[0],$this->lineX1[1]),rand($this->lineY1[0],$this->lineY1[1]),rand($this->lineX2[0],$this->lineX2[1]),rand($this->lineY2[0],$this->lineY2[1]),$this->randColor);
        }
        self::writeText();
}
         
    private function getImgType($imgType){
        $this->imgType=strtolower($imgType);
        switch($this->imgType){
            case "gif":
            return "Content-type:image/gif";
            break;
            case "jpeg":
            return "Content-type:image/jpeg";
            break;
            case "png":
            return "Content-type:image/png";
            break;
            case "wbmp":
            return "Content-type:image/wbmp";
            break;
            default:
            die("This type was unknow!");
        }
    }

    public function getImg(){
        header(self::getImgType($this->imgType));
        $this->imgType=strtolower($this->imgType);
        switch($this->imgType){
            case "gif":
            imagegif(self::setImg());
            imagedestroy(self::setImg());
            break;
            case "jpeg":
            imagejpeg(self::setImg());
            imagedestroy(self::setImg());
            break;
            case "png":
            imagepng(self::setImg());
            imagedestroy(self::setImg());
            break;
            case "wbmp":
            imagewbmp(self::setImg());
            imagedestroy(self::setImg());
            break;
            default:
            die("This type was unknow!");
        }
    }

}    
    
$obj=new verifyCode();
$obj->getImg();
    
网友评论