包装一个php的验证码类

  验证码是我们开发的时候经常用到的功能,所以在此本人包装了一个验证码类,应该可以作为php的类插件用,在此分享给各位博客园的读友。

  实现的原理也是很简单,就是利用画布的几个元素,再加上一些字符串的获取,东凑西凑就构成了,呵呵。

  这里大概写一下思路吧,其实这个类已经注释的非常清楚了,不过,个人还是在行文前啰嗦一下。

  首先是关于一些函数的解释,这里的解释纯属个人体会,有什么错误的地方,还请读者指正。

  1、创建画布函数:imagecreatetruecolor(w,h);

    说明:用于创建一个画布。

    w 画布的宽

    h 画布的高

    此函数的返回值资源类(gd)

  2、为画布创建一种颜色:imagecolorallocate(img,red,green,blue)

    说明:

    img画布资源

    red,green,blue  是0~255的范围

  3、为画布添加背景色

    imagefill(img,x,y,color);

    说明:

    在 image 图像的坐标 xy(图像左上角为 0, 0)

  4、画边框

    imagerectangle($img,x1,y1,x2,y2,color);

    说明:

    其左上角坐标为 x1, y1,右下角坐标为 x2, y2。图像的左上角坐标为 0, 0。

  3、绘制内容(字符)

    imagestring(img ,size,x,y,string,color);

    说明:

    img画布

    size是字大小 1至5

    x,y是起始点

    string是所要画的内容

    color是颜色

  4、告诉浏览器图片格式

    header("Content-type:image/png");可为image/gif等等

  5、输出(或保存),也可以使用第2个参数实现保存

    imagepng(img【,filename】)

    imagejpeg(img【,filename】)

    imagegif(img【,filename】)

  6、添加干扰线,本质就是直线

    imageline(img,x1,y1,x2,y2,color);

    说明:

      img 画布

      x1,y1 起点

      x2,y2 终点

      color 颜色

  7、imagettftext ( img,size, angle, x, y, color, fontfile,text )

      说明:

        img 画布

        size 字体大小,缺省单位像素

        angle 角度

        x,y 坐标点

        color 颜色

        fontfile 字体文件,必须是中文字体

        text 内容

  特别说明:这里的color参数都是imagecolorallocate()函数创建的颜色

  下面是思路:

  这里最先生成画布,之后就是为画布添加字符串,直线,噪点,边框,来生成验证码的,最后类返回的两个公用接口是:可供外面调用的生成验证码的画布和验证码的字符串构成,为的是给外界输出验证码画布,以及存储字符串,作为验证用

  下面是代码:

<?php
namespace captcha;
/*
*验证码类
*verify方法生成验证码字符串
*entry方法生成验证码
*特别提醒:这里要先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法调用captchaImage生成的,所以必须先调用它才行
*有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
*/
class Captcha{
    //配置参数
    private $config = array();
    //验证码
    private $verifyCode = ‘‘;
    //获取配置文件的配置信息,给类传参数就行,例如new Captcha($config);$config是你的配置文件信息
    public function __construct($config=array(‘width‘=>100,‘height‘=>40,‘length‘=>4,‘size‘=>7,‘lines‘=>0,‘dots‘=>0,‘font‘=>‘simfang.ttf‘,‘rectangle‘=>array(255,55,122),‘charset‘=>true,‘chinese‘=>‘来到新机场主航站楼建设在婚姻关系存续期间所负债务她在收到要求她偿还前夫在婚姻关系存续期间所欠债务的法院传票后要精益求精善始善终‘)){
        $this->config = $config;
    }
    //创建验证码
    private function captchaImage(){
        //画布
        $img = imagecreatetruecolor($this->config[‘width‘],$this->config[‘height‘]);
        //填充画布颜色
        imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
        //需要边框则画边框
        if($this->config[‘rectangle‘] && is_array($this->config[‘rectangle‘]) && count($this->config[‘rectangle‘]) == 3){
            $this->tangle($img);
        }
        $this->verifyCode = $this->code($img,$this->config[‘charset‘],$this->config[‘chinese‘]);
        //存在则添加干扰线
        if($this->config[‘lines‘]){
            $this->codeLines($img);
        }
        //存在则添加干扰点
        if($this->config[‘dots‘]){
            $this->codeDots($img);
        }
        return $img;
    }
    private function codeLines($img){
        //绘制干扰线
        for($i=0;$i<$this->config[‘lines‘];$i++){
            imageline($img,mt_rand(0,$this->config[‘width‘] / 10),mt_rand(0,$this->config[‘height‘]),mt_rand($this->config[‘width‘] * 7/ 10,$this->config[‘width‘] * 9/ 10),mt_rand(0,$this->config[‘height‘]),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255)));
        }
    }
    private function codeDots($img){
        //添加噪点
        for($i=0;$i<$this->config[‘dots‘];$i++){
            //噪点颜色
            $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180));
            imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),‘*‘,$color);

        }
    }
    /*画布边框*/
    private function tangle($img){
        imagerectangle($img,0,0,$this->config[‘width‘]-1,$this->config[‘height‘]-1,imagecolorallocate($img,$this->config[‘rectangle‘][0],$this->config[‘rectangle‘][1],$this->config[‘rectangle‘][2]));
    }
    /*生成验证码,默认英文,$ch为true则为中文*/
    private function code($img,$ch=false,$set=‘‘){
        $str = "";
        //计算间隔
        $span = ceil($this->config[‘width‘]/($this->config[‘length‘]+1));
        if($ch && !empty($set)){
            //随机产生字符
            $set = $this->config[‘chinese‘];
            for($i=0;$i<$this->config[‘length‘];$i++){
                $end = strlen($set)/3;
                $pos = mt_rand(0,$end-1);
                $str .= substr($set,$pos*3,3);
            }
            //每次绘制一个字符
            for($i=1;$i<=$this->config[‘length‘];$i++){
                imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config[‘height‘]*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config[‘font‘],substr($str,($i-1)*3,3));
            }
        }else{
            //随机生成字母或者数字
            for($i=0;$i<$this->config[‘length‘];$i++){
                switch(mt_rand(0,2)){
                    case 0:
                    $str .= chr(mt_rand(65,90));
                    break;
                case 1:
                    $str .= chr(mt_rand(97,122));
                    break;
                case 2:
                    $str .= chr(mt_rand(48,57));
                }
            }
            //每次绘制一个字符
            for($i=1;$i<=$this->config[‘length‘];$i++){
                imagestring($img,$this->config[‘size‘],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)));
            }
        }
        return $str;
    }
    //获取验证码
    public function verify(){
        return $this->verifyCode;
    }
    //生成验证码
    public function entry(){
        header("content-type:image/png");
        imagepng($this->captchaImage());
    }
}
$ob = new Captcha;
$ob->entry();
最后,为了不误人子弟,还是再强调一遍:这里必须先用entry生成验证码,再用verify生成验证码的字符串,也就是必须先调用entry,然后才能够调用verify生成验证码的字符串,原因代码已经说明问题了,因为验证码的字符串是在entry方法的方法captchaImage中生成的,所以必须先调用它才行 有的地方对中文的字体要求比较高,所以,有的地方不支持中文验证码
要是觉得对你有帮助,可以扫一扫右边的打赏功能,打赏一下作者呢
时间: 2024-10-12 13:07:06

包装一个php的验证码类的相关文章

建立一个漂亮的PHP验证码类文件及调用方式

//验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 private $width = 130;//宽度 private $height = 50;//高度 private $img;//图形资源句柄 private $font;//指定的字体

一个生成网页验证码的类 (mycome-validate)

一个小练习 可以通过 BufferedImage next() 返回一个内存图片 也可以通过String void next(OutputStream out) 写到一个输出流中,并返回验证码的值 jar包下载:http://files.cnblogs.com/mycome/mycome-validate.zip package validate; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; i

一个漂亮的php验证码类

一个漂亮的php验证码类(分享) 作者: 字体:[增加 减小] 类型:转载 下面小编就为大家分享一个漂亮的php验证码类.需要的朋友可以过来参考下 直接上代码: 复制代码 代码如下: //验证码类class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 pri

一个漂亮的php验证码类(分享)

直接上代码: //验证码类 class ValidateCode { private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子 private $code;//验证码 private $codelen = 4;//验证码长度 private $width = 130;//宽度 private $height = 50;//高度 private $img;//图形资源句柄 private $font

一个经典的PHP验证码类分享

我们通过PHP的GD库图像处理内容,设计一个验证码类Vcode.将该类声明在文件vcode.class.php中,并通过面向对象的特性将一些实现 的细节封装在该类中.只要在创建对象时,为构造方法提供三个参数,包括创建验证码图片的宽度.高度及验证码字母个数,就可以成功创建一个验证码类的对象. 该类的声明代码如下所示: <?php class Vcode { private $width; //宽 private $height; //高 private $num; //数量 private $co

一个很好用的php验证码类,代码和使用方法

验证码类的代码:ValidationCode <?php    class ValidationCode {        private $width;        private $height;        private $codeNum;        private $image;   //图像资源        private $disturbColorNum;        private $checkCode; function __construct($width=80,

ThinkPHP 3.2.3 加减乘法验证码类

ThinkPHP 3.2.3 自带的验证码类位于 /ThinkPHP/Library/Think/Verify.class.php,字体文件位于 /ThinkPHP/Library/Think/Verify/ 可以在 Verify.class.php 文件内进行修改,也可以单独写一个类继承自带的验证码类.如果单独写一个继承的类,可以重用父类的属性和方法,但是要注意的是父类中有一些属性和方法是私有(private)的,可以修改这些私有的属性和方法为保护(protected)的,如果不希望修改框架自

2、载入验证码类及$_SESSION处理

1.载入验证码类,并验证 (1)下载定义好的code验证码类,放置到resources目录下 (2) 添加路由 Route::get('/admin/code','Admin\[email protected]'); (3)添加方法 LoginController.php public function code() { $code = new \Code(); $code->make(); } 注意: 不要忘记引入Code类,不加'\',会引入App\Http\Controllers\Admi

PHP-解析验证码类--学习笔记

1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1  定义变量 //随机因子 private $charset = 'abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789'; private $code; private $codeLen = 4; private $width = 130; private $heigh = 50; private $