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

生成并输出验证码 Vcode.class.php

来源:互联网 收集:自由互联 发布时间:2021-06-28
生成并输出验证码 Vcode.class.php true = isset($arr['true'])? $arr['true'] : true; $this-width = isset($arr['width'])? $arr['width'] : 100; $this-height = isset($arr['height'])? $arr['height'] : 30; $this-strlen = isset($arr['strlen'
生成并输出验证码 Vcode.class.php
 true = isset($arr['true'])? $arr['true'] : true;
        $this->width = isset($arr['width'])? $arr['width'] : 100;
        $this->height = isset($arr['height'])? $arr['height'] : 30;
        $this->strlen = isset($arr['strlen'])? $arr['strlen'] : 4;
        $this->fontSize = isset($arr['fontSize'])? $arr['fontSize'] : 16;
        $this->percent = isset($arr['percent'])? $arr['percent'] : 5;
        if($CN){
            $this->strArray = isset($arr['strArray'])? $arr['strArray'] : $this->arrayCN($this->strlen,$stringCN);
        }else{
            $this->strArray = isset($arr['strArray'])? $arr['strArray'] : $this->num_letter($this->strlen);
        }
        $this->family   = isset($arr['family']) ? $arr['family'] :'Fonst/msyh.ttf';
        // 1.调用创建验证码方法
        self::createVcode();
    }

     private function createVcode(){
        /**
         * 生成并输出验证码图片
         *
         */
         $per=mt_rand(0,$this->percent)/100;//干扰点占据整个图像的最大百分比

        // 1.创建真彩画布资源
        $img = imagecreatetruecolor($this->width, $this->height);

        // 2.为图像分配随机颜色
        //  2.1生成随机色   $color = mt_rand(0,255);背景色限制在200到255之间(比较浅的颜色,不至于影响观看)
        $backGroundColor = imagecolorallocate($img, mt_rand(200,255), mt_rand(200,255), mt_rand(200,255));

        // 3.给生成的画布填充背景色 imagefill($img,x,y,color);
        imagefill($img, 0, 0, $backGroundColor);

        // 4.将文本写入画布
        $wordBox    = floor($this->width/$this->strlen);//每个字的空间大小恒定
        $wordBox_x  = floor(($wordBox-$this->fontSize)/4);//字符在画布中的起始位置坐标
        $yOffset    = $this->height*0.1;//字符在垂直方向距离顶部和底部的高度为,整个高度的0.1倍
        for($i=0;$i<$this->strlen;$i++){
            // $x   = $wordBox_x+$wordBox*$i;//字符起始位置坐标加上第$i个字符空间
            // $y   = mt_rand($this->fontSize+4,$this->height-4);//字体大小到画布高度之间任意位置即可实现在边界范围内上下波动位置
            $textColor = imagecolorallocate($img, mt_rand(0,100), mt_rand(0,100), mt_rand(0,100));//随机字体颜色
            imagettftext($img,mt_rand($this->fontSize*0.6,$this->fontSize*1.1),mt_rand(-20,20),$wordBox_x+$wordBox*$i,mt_rand($this->fontSize+$yOffset,$this->height-$yOffset),$textColor,'./Fonst/msyh.ttf',$this->strArray[$i] );
        }

        // 11.写入session的vcode中$_SESSION['vcode']
        @session_start();
        $_SESSION['vcode'] = $this->strArray;

        // 5.给画布添加干扰线
        $n  = 2*$this->strlen;//floor($this->height*0.1)
        $x1 = $this->width*0.8;
        $x2 = $this->width*0.2;
        for($i=0;$i<$n;$i++){
            $lineColor = imagecolorallocate($img, mt_rand(100,255), mt_rand(100,255), mt_rand(100,255));
            if($i<$n/2){
                imageline($img,mt_rand(0,$x1), mt_rand(0,30), mt_rand($x2,$this->width), mt_rand(0,30), $lineColor);
            }else{
                imagearc($img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,360),mt_rand(0,360),$lineColor);
            }
        }

        // 6.给画布添加干扰点
        $area = $this->height*$this->width*$per;
        for($i=0;$i<$area;$i++){
            $pixelColer = imagecolorallocate($img, mt_rand(0,255), mt_rand(0,255), mt_rand(0,255));
            imagesetpixel($img, mt_rand(0,$this->width), mt_rand(0,$this->height), $pixelColer);
        }


        // 7.设置头信息,告诉浏览器以图片格式输出
        header("content-type:image/png");

        // 8.清屏,为图片输出创在输出环境
        ob_clean();

        // 9.以png格式输出图片
        imagepng($img);
        // 10.销毁资源
        imagdestory($img);
    }


    public static function arrayCN($n=4,$stringCN=''){
    /**返回随机四个汉字字符组成的数组
     * @param   int      $n         = 4; 汉字字符的个数
     * @param   string   $stringCN  = "社过前面农也得与说之员而务利电文事可种总改三各好金第司其从平代当天水四运县军件育局干队团又造形级标联专少费效据手施权江近深更认果格几看没惯循蓝烧触陕拖伯盲宪净卢炭籍秦粉妻爆欣释玩俊欠蛋猛迪苗暂貌遵锡楚桂昆杜皇醒燃凤截铺液撤胶慢杭虚辞曼毅咨俗糖忽芳姐耗妈谊浦频阻允宅窗默胀弃倡灭甲症埃滨赏莱拒淡坛陵绘虎竹赢锋篮迷纽轿贩递娘圈挖炉替幼乃郊颇戴滑徒崇涛焦凝墙吧炎刀玻寿履圣昨酸朗媒桑铜仲亦诞揭纵漫愈辟",如果没有设置则默认为从该字符串中查找
     * @param   boolean  $true      =true  返回值是否是数组,为真,数组;假,字符串
     * @return  mixed(array/string) $charCN    返回$n个随机汉字
     *  func_num_args:实参个数;
     *  func_get_arg:返回某一个实参,必须是实参数组的索引;
     *  func_get_args:返回实参数组;
     */
        header("content-type:text/html;charset=utf-8");
        if(!isset($stringCN) || $stringCN==''){
            $stringCN = "社过前面农也得与说之员而务利电文事可种总改三各好金第司其从平代当天水四运县军件育局干队团又造形级标联专少费效据手施权江近深更认果格几看没惯循蓝烧触陕拖伯盲宪净卢炭籍秦粉妻爆欣释玩俊欠蛋猛迪苗暂貌遵锡楚桂昆杜皇醒燃凤截铺液撤胶慢杭虚辞曼毅咨俗糖忽芳姐耗妈谊浦频阻允宅窗默胀弃倡灭甲症埃滨赏莱拒淡坛陵绘虎竹赢锋篮迷纽轿贩递娘圈挖炉替幼乃郊颇戴滑徒崇涛焦凝墙吧炎刀玻寿履圣昨酸朗媒桑铜仲亦诞揭纵漫愈辟";
        }
        $arrayCN = array();
        $index = strlen($stringCN)/3-1;
        for($i=0;$i<$n;$i++){
            $indexCN = mt_rand(0,$index);
            $arrayCN[] = substr($stringCN, $indexCN*3-3,3);
        }
        return $arrayCN;
    }

    /**返回随机的范围是0-9,a-Z之间的长度为四的字符串
     * @param   int $this->strlen = 4 生成的字符串长度
     * @return  string $vcode 返回随机的范围是0-9,a-Z之间的长度为四的字符串
     */
    public static function num_letter($strlen=4){
        $vcode = "";
        $strArray   = array_merge(range(0, 9),range('a', 'z'),range('A', 'Z'));
        // 从合并的数组中随机获取$this->strlen个键值组成一个新的数组$vcodeArray
        $vcodeArray = array_rand($strArray,$strlen);
        foreach($vcodeArray as $key){
            $vcode .= $strArray[$key];//连接元素组成验证码字符串
        }
        return $vcode;
    }

    public static function checkVcode($vcode){
        @session_start();
        return strtolower($vocde) === strtolower($_SESSION['vcode']);
    }

    /**
     * 析构方法:
     */
    public function __destruct(){

    }
}
/**
 * 实例化验证码对象,直接输出验证码参数如下:new Vcode($CN=false,$arr=array(),$stringCN='')验证码
 * @param bool $CN=false 默认为false,验证码字符是 数字+字母;为true为内置字库(约200个)的汉字
 * @param array $arr [<验证码的属性设置>]
 * array(
 *   'true' => 'true' ;   //生成的$strlen长度的验证码字符串是否按数组形势输出
 *   'width' => 100 ;     //验证码图像的长度,单位像素
 *   'height' => 30 ;     //验证码图像的宽度,单位像素
 *   'strlen' => 4 ;      //验证码的字符个数,单位像素
 *   'fontSize' => 16;    //验证码字符的大小,单位像素
 *   'percent' => 5 ;     //验证码中干扰点所占验证码图片的最大百分比,取值[1-100]
 *   'family' => 'msyh.ttf' ;     //字体文件相对路径
 * );
 * @param  string $stringCN'=>'');
 * stringCN:外部汉字字符串,汉字验证码汉字来源;默认为空,使用方法中内置汉字
 */

// $vcode = new Vcode(true,array(),$stringCN='验证码的字符个数');
网友评论