zoukankan      html  css  js  c++  java
  • 封装验证码类

    <?php

        //验证码工具类

        class Captcha{
            //属性
            private $width;
            private $height;
            private $fontsize;
            private $pixes;
            private $lines;
            private $str_len;

            /*
             * 构造方法
             * @param1 array $arr = array(),初始化属性的关联数组
            */
            public function __construct($arr = array()){
                //初始化
                $this->width = isset($arr['width']) ? $arr['width'] : $GLOBALS['config']['captcha']['width'];
                $this->height = isset($arr['height']) ? $arr['height'] : $GLOBALS['config']['captcha']['height'];
                $this->fontsize = isset($arr['fontsize']) ? $arr['fontsize'] : $GLOBALS['config']['captcha']['fontsize'];
                $this->pixes = isset($arr['pixes']) ? $arr['pixes'] : $GLOBALS['config']['captcha']['pixes'];
                $this->lines = isset($arr['lines']) ? $arr['lines'] : $GLOBALS['config']['captcha']['lines'];
                $this->str_len = isset($arr['str_len']) ? $arr['str_len'] : $GLOBALS['config']['captcha']['str_len'];
            }

            /*
             * 产生验证码图片
            */
            public function generate(){
                //制作画布
                $img = imagecreatetruecolor($this->width,$this->height);

                //给定背景色
                $bg_color = imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
                imagefill($img,0,0,$bg_color);

                //制作干扰线
                $this->getLines($img);

                //增加干扰点
                $this->getPixels($img);

                //增加验证码文字
                $captcha = $this->getCaptcha();

                //文字颜色
                $str_color = imagecolorallocate($img,mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));

                //写入文字
                //计算文字应该出现的起始位置
                $start_x = ceil($this->width/2) - 25;
                $start_y = ceil($this->height/2) - 8;

                if(imagestring($img,$this->fontsize,$start_x,$start_y,$captcha,$str_color)){
                    //成功:输出验证码
                    header('Content-type:image/png');
                    imagepng($img);
                }else{
                    //失败
                    return false;
                }

            }

            /*
             * 获取验证码随机字符串
             * @return string $captcha,随机验证码文字
            */
            private function getCaptcha(){
                //获取随机字符串
                $str = implode('',array_merge(range('a','z'),range('A','Z'),range(1,9)));

                //随机取
                $captcha = '';    //保存随机字符串
                for($i = 0,$len = strlen($str);$i < $this->str_len;$i++){
                    //每次随机取一个字符
                    $captcha .= $str[mt_rand(0,$len - 1)] . ' ';
                }

                //将数据保存到session
                $_SESSION['captcha'] = str_replace(' ','',$captcha);

                //返回值
                return $captcha;
            }

            /*
             * 增加干扰点
             * @param1 resource $img
            */
            private function getPixels($img){
                //增加干扰点
                for($i = 0;$i < $this->pixes;$i++){
                    //分配颜色
                    $pixel_color = imagecolorallocate($img,mt_rand(100,150),mt_rand(100,150),mt_rand(100,150));

                    //画点
                    imagesetpixel($img,mt_rand(0,$this->width),mt_rand(0,$this->height),$pixel_color);
                }
            }

            /*
             * 增加干扰线
             * @param1 resource $img,要增加干扰线的图片资源
            */
            private function getLines($img){
                //增加干扰线
                for($i = 0;$i < $this->lines;$i++){
                    //分配颜色
                    $line_color = imagecolorallocate($img,mt_rand(150,200),mt_rand(150,200),mt_rand(150,200));

                    //画线
                    imageline($img,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$line_color);
                }
            }

            /*
             * 验证验证码
             * @param1 string $captcha,用户提交的验证码
             * @return bool,成功返回true,失败返回false
            */
            public static function checkCaptcha($captcha){
                //验证码不区分大小写
                return (strtolower($captcha) === strtolower($_SESSION['captcha']));
            }

        }

  • 相关阅读:
    无刷新跨域上传图片
    php框架-yii
    nginx-url重写
    linux下挂载移动硬盘ntfs格式
    页面有什么隐藏bug:字体,图片
    Oracle、MySql、SQLServer数据分页查询
    转载:Qt之界面实现技巧
    QT常用资料
    MySQL判断字段值来确定是否插入新记录
    WindowsAPI开发常用资料
  • 原文地址:https://www.cnblogs.com/shaohuixia/p/5427208.html
Copyright © 2011-2022 走看看