• PHP 如何实现图形验证码


    封装验证码函数

    <?php
    /*
        验证码
        宽 高 字母 数字 字母数字混合 干扰线 干扰点 背景色(要比字体颜色浅) 字体的颜色
    */
    /**
      * @param $width:宽
      * @param $height:高
      * @param $num:显示多少位
      * @param $type:类型 1数字,2字母,3数字大小写字母
    */
    verify();
    function verify($width = 100,$height = 40,$num = 5,$type = 3){
        // 1. 准备画布
        $image = imagecreatetruecolor($width, $height); // 设置验证码图片大小的函数
        // 2. 生成颜色(背景填充颜色,字体颜色)
        imagefilledrectangle($image, 0, 0, $width, $height, lightColor($image));// 画一矩形并填充
        // 3. 你需要什么样的字符
        $string = '';
        switch($type){
            case 1:
                $str = '0123456789';
                $string = substr(str_shuffle($str), 0 ,$num);
                break;
            case 2:
                $arr = range('a','z');
                shuffle($arr);
                $tmp = array_slice($arr,0,5);
                $string = join('', $tmp);
                break;
            case 3:
                // 0-9 a-z A-Z 
                $str = '0123456789abcdefghizklmnopqrstuvwxyzABCDEFGHIZKLMNOPQRSTUVWXYZ'; // 也可取出类似的0il
                $string = substr(str_shuffle($str),0,$num);
                break;
        }
        // 4. 开始写字
        $fontsize = 16; // 字大小
        for($i = 0;$i < $num;$i++){
            $x = floor($width / $num) * $i + 4;
            $y = mt_rand(10, $height - 20);
            imagechar($image, $fontsize, $x, $y, $string[$i], deepColor($image));// 水平低画一个字符
        }
        // 5. 干扰线(点)
        for($i = 0;$i < $num;$i++){
            imagearc($image, mt_rand(10, $width), mt_rand(10, $height), mt_rand(10, $width), mt_rand(10, $height), mt_rand(0, 10), mt_rand(0, 270), deepColor($image));// 画椭圆弧
        }
        for($i = 0;$i < 50;$i++){
            imagesetpixel($image, mt_rand(10, $width), mt_rand(10, $height), deepColor($image));// 画一个单一像素
        }
        // 6. 指定输出的类型
        header('Content-type:image/png');
        // 7. 准备输出图片
        imagepng($image);
        // 8. 销毁
        imagedestroy($image); // 结束图形函数 销毁$image
    
        return $string;
    }
    // 浅色
    function lightColor($image){
        return imagecolorallocate($image, mt_rand(130, 255),mt_rand(130, 255), mt_rand(130, 255)); // 为一幅图像分配颜色
    }
    // 深色
    function deepColor($image){
        return imagecolorallocate($image, mt_rand(0, 120),mt_rand(0, 120), mt_rand(0, 120));
    }
    // 如果报错Call to undefined function imagecreatetruecolor(),请开启php.int extension=gd2
    
  • 相关阅读:
    HTML5之画布的拖拽/拖放
    HDU 4028 The time of a day STL 模拟题
    java 使用htmlunit模拟登录爬取新浪微博页面
    【java.lang.UnsupportedClassVersionError】版本不一致出错
    Unsupported major.minor version 52.0
    java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal问题解决
    htmlunit抓取js执行后的网页源码
    Maven添加本地依赖
    htmlunit爬取js异步加载后的页面
    HtmlUnit爬取Ajax动态生成的网页以及自动调用页面javascript函数
  • 原文地址:https://www.cnblogs.com/lisaShare/p/12513469.html
Copyright © 2020-2023  润新知