封装captcha类 -- 画图四

Posted Mr Zhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了封装captcha类 -- 画图四相关的知识,希望对你有一定的参考价值。

<?php
    
    // 验证码类
    class Captcha{
        //属性
        private $width;
        private $height;
        private $length;
        private $lines;
        private $pixels;
        private $color;
        private $font;
        private $string;
        /*
         *构造方法
         *@param1 array $arr, 一个数组, 里面几乎包含了所有的属性
         *
         */
        public function __construct($arr = array()) {
            $this->width = isset($arr[‘width‘]) ? $arr[‘width‘] : 146;
            $this->height = isset($arr[‘height‘]) ? $arr[‘height‘] : 20;
            $this->length = isset($arr[‘length‘]) ? $arr[‘length‘] : 4;
            $this->lines = isset($arr[‘lines‘]) ? $arr[‘lines‘] : 5;
            $this->pixels = isset($arr[‘pixels‘]) ? $arr[‘pixels‘] : 200;
            $this->font = isset($arr[‘font‘]) ? $arr[‘font‘] : 5;
            // 背景色
            $this->color[‘bg_min‘] = isset($arr[‘bg_min‘]) ? $arr[‘bg_min‘] : 200;
            $this->color[‘bg_max‘] = isset($arr[‘bg_max‘]) ? $arr[‘bg_max‘] : 255;
            // 字体颜色
            $this->color[‘font_min‘] = isset($arr[‘font_min‘]) ? $arr[‘font_min‘] : 0;
            $this->color[‘font_max‘] = isset($arr[‘font_max‘]) ? $arr[‘font_max‘] : 100;
            // 线颜色
            $this->color[‘line_min‘] = isset($arr[‘line_min‘]) ? $arr[‘line_min‘] : 100;
            $this->color[‘line_max‘] = isset($arr[‘line_max‘]) ? $arr[‘line_max‘] : 150;
            // 像素颜色
            $this->color[‘pixels_min‘] = isset($arr[‘pixels_min‘]) ? $arr[‘pixels_min‘] : 150;
            $this->color[‘pixels_max‘] = isset($arr[‘pixels_max‘]) ? $arr[‘pixels_max‘] : 200;
            // 字符串
            $this->string = isset($arr[‘string‘]) ? $arr[‘string‘] : ‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789‘;

        }

        /*
         *获得验证码图片
         *
         */
        public function generate() {

            //1. 创建画布
            $im = imagecreatetruecolor($this->width, $this->height);    

            //2. 背景顏色
            //2.1分配顏色
            $bg_color = imagecolorallocate($im, mt_rand($this->color[‘bg_min‘], $this->color[‘bg_max‘]), mt_rand($this->color[‘bg_min‘], $this->color[‘bg_max‘]), mt_rand($this->color[‘bg_min‘], $this->color[‘bg_max‘])); 

            //2.2背景填充
            imagefill($im, 0, 0, $bg_color);

            // 3.获取验证码
            $captcha = $this->getCaptchaStr();

            // var_dump($captcha); exit;

            // 4.分配颜色
            $str_color = imagecolorallocate($im, mt_rand($this->color[‘font_min‘], $this->color[‘font_max‘]), mt_rand($this->color[‘font_min‘], $this->color[‘font_max‘]), mt_rand($this->color[‘font_min‘], $this->color[‘font_max‘]));

            //5. 将验证码写入到图片
            imagestring($im, $this->font, ceil($this->width / 2) - 20, ceil($this->height / 2) - 10, $captcha, $str_color);

            // 6. 增加干扰线
            for( $i = 0; $i < $this->lines; $i++ ){
                // 分配颜色
                $line_color = imagecolorallocate($im, mt_rand($this->color[‘line_min‘], $this->color[‘line_max‘]), mt_rand($this->color[‘line_min‘], $this->color[‘line_max‘]), mt_rand($this->color[‘line_min‘], $this->color[‘line_max‘]));
                // 写入线段
                imageline($im, mt_rand(0, $this->width), mt_rand(0, $this->height), mt_rand(0, $this->width), mt_rand(0, $this->height), $line_color);
            }

           // 7. 增加干扰点
           for( $i = 0; $i < $this->pixels; $i++ ){
                $pixels_color = imagecolorallocate($im, mt_rand($this->color[‘pixels_min‘], $this->color[‘pixels_max‘]), mt_rand($this->color[‘pixels_min‘], $this->color[‘pixels_max‘]), mt_rand($this->color[‘pixels_min‘], $this->color[‘pixels_max‘]));
                // 写入线段
                imagesetpixel($im, mt_rand(0, $this->width), mt_rand(0, $this->height), $pixels_color);

            }

            // 8. 保存输出
            imagepng($im);
            // imagepng($im, ‘captcha.png‘);
            
            // 9. 释放资源
            imagedestroy($im);

        }

        /*
         *获得验证码字符串
         *
        */
        private function getCaptchaStr() {
             // 定義變量保存字符串
             $captchaStr = ‘‘;
             // for( $i = 0; $i < $this.length; $i++ ){ //傻逼写法
             for( $i = 0; $i < $this->length; $i++ ){
                 // 获取随机字符串
                 $captchaStr .= $this->string[mt_rand(0, strlen($this->string) - 1)];
             }

             // 将随机字符串存放在session中
             $_SESSION[‘captcha‘] = $captchaStr;

             return $captchaStr;
        }

    }

    $captcha  = new Captcha();

    // header(‘content-type: image/php‘);
    header(‘content-type: image/png‘);
    $captcha->generate();

 

以上是关于封装captcha类 -- 画图四的主要内容,如果未能解决你的问题,请参考以下文章

验证码逆向专栏极验三代四代点选类验证码逆向分析

tp5中引入extend中的第三方类库 这里以验证码为例

用“活着的”CNN 进行验证码识别

实验四代码评审

第七周收获

验证码识别服务 2Captcha