zoukankan      html  css  js  c++  java
  • PHP使用GD库封装验证码类

    调试小技巧:当图片无法显示时,将header函数注释掉就可以看到报错信息了

    字体文件放在当前文件目录的font文件夹中,windows的字体可以到C:WindowsFonts目录下复制过来,处理好文件名即可

    关于GD库和面向对象的知识点可以看我前面几篇随笔,直接上代码了

    <?php
    
    //验证码类
    namespace vendor;
    
    class CaptchaMaker{
        /**
         * @desc 制作验证码
         * @param int $width = 450,验证码图片默认宽度
         * @param int $height = 65,验证码图片默认高度
         * @param int $length = 4,验证码默认字符数
         * @param string $fonts = '',验证码字体,默认为空(内部使用默认字体)
         * @param int $level = 2,干扰素级别(1-3),级别越高越难辨认
         * @return null
        */
        public static function getCaptcha($width = 450,$height = 65,$length = 4,$fonts = '',$level = 2){
            //判定字体资源
            if(empty($fonts)) $fonts = 'verdana.ttf';
            $fonts = __DIR__ . '/fonts/' . $fonts;      //字体路径
            //制作画布
            $img = imagecreatetruecolor($width,$height);
            //分配背景色:随机浅色系
            $bg_color = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
            imagefill($img,0,0,$bg_color);
            //获取随机字符
            $captcha = self::getString($length);
            //保存到session
            @session_start();
            $_SESSION['captcha'] = $captcha;
            //写入图片
            for($i = 0;$i < $length;$i++){
                //增加颜色
                $c_color = imagecolorallocate($img, mt_rand(0,60), mt_rand(0,60), mt_rand(0,60));
                imagettftext($img, mt_rand(15,25), mt_rand(-45,45), $width/($length+1)*($i+1), mt_rand(25,$height-25), $c_color, $fonts, $captcha[$i]);
            }
            $interferon_level = $level ? ($level >= 1 && $level <= 3 ? $level: 2) : 2;
            //增加干扰点
            $interferon_arr = array('*','(',')','~','^','=','-','+','#','&');
            for($i = 0;$i < $interferon_level * 100;$i++){
                $dots_color = imagecolorallocate($img,mt_rand(140,190),mt_rand(140,190),mt_rand(140,190));
                imagestring($img,mt_rand(1,5),mt_rand(0,$width),mt_rand(0,$height),$interferon_arr[mt_rand(0,9)],$dots_color);
            }
            //增加干扰线
            for($i = 0;$i < $interferon_level * 10;$i++){
                $line_color = imagecolorallocate($img, mt_rand(80,130), mt_rand(80,130), mt_rand(80,130));
                //制作线段
                imageline($img,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),$line_color);
                imagearc($img,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,360),mt_rand(0,360),$line_color);
            }
            //输出资源
            header('Content-type:image/png');
            imagepng($img);
            imagedestroy($img);
        }
    
        //获取随机字符串
        private static function getString($length = 4){
            //定义变量保存数据
            $captcha = '';
            //循环随机获取数据
            for($i = 0;$i < $length;$i++){
                //随机确定数字、大写字母还是小写字母
                switch(mt_rand(1,3)){
                    case 1:                //数字:49-57分别代表1-9
                        $captcha .= chr(mt_rand(49,57));    
                        break;
                    case 2:                //小写字母
                        $captcha .= chr(mt_rand(65,90));
                        break;
                    case 3:                //大写字母
                        $captcha .= chr(mt_rand(97,122));
                        break;
                }
            }
            //返回给调用处
            return $captcha;
        }
        //验证验证码
        public static function checkCaptcha($captcha){
            //与session中存的进行对比
            @session_start();
            return (strtolower($captcha) === strtolower($_SESSION['captcha']));
        }
    }
    //测试
    CaptchaMaker::getCaptcha();
  • 相关阅读:
    Elasticsearch 支持拼音自动补全
    laravel自动补全链接
    laravel的服务容器(药箱)、服务提供者(小盒子)、Facades(更方便用药),方便大家透彻理解
    php static静态属性和静态方法
    php面向对象的构造方法与析构方法
    MySQL事务-ROLLBACK,COMMIT用法详解
    php 事务处理transaction
    Python:初步学习Python
    iOS:自己写的一个星级评价的小Demo
    iOS:枚举enum的使用
  • 原文地址:https://www.cnblogs.com/chuanzi/p/10410708.html
Copyright © 2011-2022 走看看