• PHP实现验证码


    第一步:创建一个画布

    第二步:创建颜色

    第三步:准备字符

    第四步:往 画布上写字符

    第五步:画干扰线(点)

    第六步:输出格式

    第七步:输出图片

    第八步:销毁资源

    <?php 
        verify();
    function verify($width = 100 , $height = 40 , $num = 5 , $type = 3 ){
    
    
        //1 创建画布
        $image = imagecreatetruecolor($width , $height);
        
        //2 创建颜色  //因为后边总是用,所以写了两个函数,分别是lightColor(浅颜色)、deepColor(深颜色)
        
        
        //3 创建字符 //这里是自己选择的类型,1 就是纯数字,2 就是纯小字母, 3 就是数字大小写字母的混合
        switch($type){
            case 1:
                //定义字符串
                $str = "0123456789";
                //打乱字符串
                $strNew = str_shuffle($str);
                //截取$num个
                $string = substr($strNew , 0 , $num);
                break;
            case 2:
                //定义字符
                $arr = range('a' , 'z');
                //打乱字符串数组
                shuffle($arr);
                //截取
                $tmp = array_slice($arr , 0 , $num);
                //连成字符串
                $string = join('' , $tmp);
                break;
            case 3:
                $str = "23456789abcdefghjklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ";
                $string = substr(str_shuffle($str) , 0 , $num);
                break;
        }
        //给背景填充浅颜色 //背景颜色太深的话验证码就看不清了
        imagefilledrectangle($image , 0 , 0 , $width , $height , lightColor($image));
        
        //4 往画布上写入字符
        for($i = 0; $i<$num; $i++) {  //因为我们设定的是输出5 个字符,所以$i是小于的$num
            //floor是取整,$width / $num 把宽度分了$num块地,*$i是一个字符占一块地,以免全都堆在一块看不出来
            $x = floor($width / $num) * $i;
            $y = mt_rand(10 , $height - 20);
            imagechar ($image , 5 , $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(0 , $width) , mt_rand(0 , $height) , deepColor($image));
        }
        ob_clean();//擦除缓冲区  
        //6 告诉浏览器输出格式:png
        header("Content-type: image/png");
        
        //7 输出图片
        imagepng($image);
        
        //8 销毁
        imagedestroy($image);
        
        return $string;
        //echo $string;
    }
    
    
    //设置深浅颜色
    function lightColor ($image) {
        return imagecolorallocate($image , mt_rand(120 , 255) , mt_rand(120 , 255) , mt_rand(120 , 255)); 
    }
    
    function deepColor ($image) {
        return imagecolorallocate($image , mt_rand(0 , 120) , mt_rand(0 , 120) , mt_rand(0 , 120)); 
    }    
    ?>
     
  • 相关阅读:
    java与C#、.NET AES加密、解密 解决方案
    java 类名.class、object.getClass()和Class.forName()的区别 精析
    java instanceof和isInstance的关系 精析
    java 反汇编class文件
    织梦默认分页样式改动 解决分页列表显示,去掉li
    The method Inflate() in android
    leetcode第一刷_Edit Distance
    codeforces round #264(div2)
    android开发游记:SpringView 下拉刷新的高效解决方式,定制你自己风格的拖拽页面
    《linux 内核全然剖析》 chapter 4 80x86 保护模式极其编程
  • 原文地址:https://www.cnblogs.com/alexguoyihao/p/10243955.html
Copyright © 2020-2023  润新知