php验证码类 支持中文或英文验证码

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:917篇文章
  • 发布时间:2021年03月04日 18:39:35
  • 所属分类:PHP+MySql
  • 阅读次数:1830次阅读
  • 标签:
<?php 
#封装验证码类
class Captcha{
    #定义属性
    private $width;
    private $height;
    private $chars;    #随机字符长度
    private $font;     #随机字体
    private $lines;    #干扰线数量
    private $pixels;   #干扰点数量
    private $type;     #字符类型中文或英文   1为中文 其他为英文

    #构造函数
    public function __construct($arr=array()){
        $this->width = isset($arr['width'])?$arr['width']:145;
        $this->height = isset($arr['height'])?$arr['height']:30;
        $this->chars = isset($arr['chars'])?$arr['chars']:4;
        $this->font = isset($arr['font'])?$arr['font']:5;
        $this->lines = isset($arr['lines'])?$arr['lines']:2;
        $this->pixels = isset($arr['pixels'])?$arr['pixels']:100;
        $this->type = isset($arr['type'])?$arr['type']:1;

        if($this->type==1){
            $this->ChaineseCaptcha();
        }else{
            $this->generate();
        }

    }

    #生成画布以及干扰元素
    public function makeBaseImage(){
        #基本画布
        $image = imagecreatetruecolor($this->width, $this->height);
        #画布颜色,随机获取
        $color = imagecolorallocate($image, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));
        #画布填充
        imagefill($image, 0, 0, $color);
        #调用干扰线(点) 生成函数
        #生成干扰元素
        $this->setLines($image);  #干扰线
        $this->setPixel($image);  #干扰点
        #返回画布,供其他元素部分使用
        return $image;
    }

    /**
     * 生成中文验证码
     * @param  string   $ttfname   使用的中文字体
     * @param  recoure  $image       图片资源
     * @param  return 中文验证码
     */
    public function ChaineseCaptcha($ttfname='./simkai.ttf'){
        #使用makeChainese得到的字符
        #生成画布
        $image =$this->makeBaseImage();
        
        #在画布上写中文文字
        #文字颜色

        $color = imagecolorallocate($image,mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));
        #获取要操作的中文验证码文字
        $captcha =$this->makeChainese();
        #开启sesssion
        @session_start();
        $_SESSION['captcha'] = $captcha;
        #画出文字
        imagettftext($image, 15, 2, 30, 20, $color, $ttfname, $captcha);
        #显示验证码
         $this->show($image);
         #销毁资源
         imagedestroy($image);
    }

    /**  该环境是在 utf-8 下使用,若是gbk,请谨慎使用
     * @param  string   $filename  保存的中文文字文件
     * @return char_chainese
     * 
     */
    private function makeChainese($filename='./content_chainese.txt'){
        $str = file_get_contents($filename);
        $captcha ='';
        #循环三次,取三个中文字符
        for($i=0 ;$i<3 ;$i++){
            $rand = mt_rand(0 ,strlen($str)-1);
            $rand = $rand-($rand%3);
            $captcha .=substr($str, $rand,3);
        }
        return $captcha;
    }



    #生成验证码图片的方法
    /**
     * @return 图片
     */
    public function generate(){
        #制作画布
        $image =$this->makeBaseImage();        

        #生成随机字符
        $captcha = $this->setRandCaptcha($image ,$this->chars);

        #session 保存
        session_start();
        $_SESSION['captcha'] = $captcha;

        #把字符串写入图片资源
        #颜色
        $color = imagecolorallocate($image,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
        imagestring($image ,$this->font ,20,3,$captcha ,$color);

        $this->show($image);
          #释放图片资源
        imagedestroy($image);
    }

    private function show($image){
        header("content-type:image/png");
        imagepng($image);
    }

    #生成随机字符
    private function setRandCaptcha(){
        #生成随机字符串
        // $str =implode('' ,array_merge(range('1', '9'),range('a', 'z'),range('A', "Z")));
        $str = "23456789ABCDEFGHJKLMNPQRSTUVYXZabcdefghkmnpqrstuvyxz";
        #得到随机字符串
        $captcha ='';
        for($i=0 ;$i<$this->chars ;$i++){
            $captcha .=$str[mt_rand(0,strlen($str)-1)].'';
        }
        return $captcha;
       
    }

    #增加干扰线
    /**
     * @param  resource  $image
     */

    private function setLines($image){
        #线的颜色
        for($i=0 ; $i<$this->lines ;$i++){
            $color = imagecolorallocate($image, mt_rand(100,150), mt_rand(100,150), mt_rand(100,150));
            imageline($image, mt_rand(0,$this->width), mt_rand(0,$this->height), mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
        }
    }

    #增加像素点
    /**
     * @return 返回点
     */
    private function setPixel($image){
        #循环画点
        for($i=0;$i<$this->pixels;$i++){
            $color=imagecolorallocate($image,mt_rand(150,200), mt_rand(150,200), mt_rand(150,200));
            #生成点
            imagesetpixel($image, mt_rand(0,$this->width), mt_rand(0,$this->height), $color);
        }
    }

    #增加验证方法
    /**
     * @param  string  $captcha  用户输入的验证码
     * @return boolean
     */
    public static function compareCaptcha($captcha){
        #比较,不区分大小写
        #开启session
        session_start();
        return  strtolower($captcha)===strtolower($_SESSION['captcha']);
    }

}
$c = new Captcha(array('type'=>1));

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!