您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

增加动态验证码

2025/12/29 12:25:04发布21次查看
增加动态验证码,跳动的验证码增强视觉体验
首先打开thinkphp官方的image类文件,默认在thinkphp\extend\library\org\util下面。
打开找到第405行下面添加(也就是生成图像验证码方法下面),增加一个生成动态验证码的方法。    /**
     * 生成动态图像验证码
     * @static
     * @access public
     * @param string $length  位数
     * @param string $mode  类型
     * @param string $width  宽度
     * @param string $height  高度
     * @return string
     */
    static function buildactiveimageverify($length=4, $mode=1, $width=60, $height=22, $verifyname='verify') {
        import('org.util.string');
        import('org.util.gifencoder');
        $randval = string::randstring($length, $mode);
        session($verifyname, md5($randval));
        $width = ($length * 10 + 10) > $width ? $length * 10 + 10 : $width;
        // 生成一个32帧的gif动画
        for($i=0;$i        ob_start();
        $image=imagecreate($width,$height);
        imagecolorallocate($image,0,0,0);
        // 设定文字颜色数组 
        $colorlist[]=imagecolorallocate($image,15,73,210);
        $colorlist[]=imagecolorallocate($image,0,64,0);
        $colorlist[]=imagecolorallocate($image,0,0,64);
        $colorlist[]=imagecolorallocate($image,0,128,128);
        $colorlist[]=imagecolorallocate($image,27,52,47);
        $colorlist[]=imagecolorallocate($image,51,0,102);
        $colorlist[]=imagecolorallocate($image,0,0,145);
        $colorlist[]=imagecolorallocate($image,0,0,113);
        $colorlist[]=imagecolorallocate($image,0,51,51);
        $colorlist[]=imagecolorallocate($image,158,180,35);
        $colorlist[]=imagecolorallocate($image,59,59,59);
        $colorlist[]=imagecolorallocate($image,0,0,0);
        $colorlist[]=imagecolorallocate($image,1,128,180);
        $colorlist[]=imagecolorallocate($image,0,153,51);
        $colorlist[]=imagecolorallocate($image,60,131,1);
        $colorlist[]=imagecolorallocate($image,0,0,0);
        $fontcolor=imagecolorallocate($image,0,0,0);
        $gray=imagecolorallocate($image,245,245,245);
        $color=imagecolorallocate($image,255,255,255);
        $color2=imagecolorallocate($image,255,0,0);
        imagefill($image,0,0,$gray);
        $space=15;// 字符间距
        if($i>0){// 屏蔽第一帧
            $top=0;
            for($k=0;$k                $colorrandom=mt_rand(0,sizeof($colorlist)-1);
                $float_top=rand(0,4);
                $float_left=rand(0,3);
                imagestring($image,6,$space*$k,$top+$float_top,substr($randval,$k,1),$colorlist[$colorrandom]);
            }
       }
        for($k=0;$k            $colorrandom=mt_rand(0,sizeof($colorlist)-1);
            imagesetpixel($image,rand()%70,rand()%15,$colorlist[$colorrandom]);
}
        // 添加干扰线
        for($k=0;$k            $colorrandom=mt_rand(0,sizeof($colorlist)-1);
            $todrawline=1;
            if($todrawline){
                imageline($image,mt_rand(0,$width),mt_rand(0,$height),mt_rand(0,$width),mt_rand(0,$height),$colorlist[$colorrandom]);
            }else{
                $w=mt_rand(0,$width);
                $h=mt_rand(0,$width);
                imagearc($image,$width-floor($w / 2),floor($h / 2),$w,$h, rand(90,180),rand(180,270),$colorlist[$colorrandom]);
            }
        }
        imagegif($image);
        imagedestroy($image);
        $imagedata[]=ob_get_contents();
        ob_clean();
        ++$i;
    }
    $gif=new gifencoder($imagedata);
    header('content-type:image/gif');
    echo $gif->getanimation();
    }然后将gifencoder类文件放入同级目录中does not supported function for only one image!, 
        'err01'=>source is not a gif image!, 
        'err02'=>unintelligible flag , 
        'err03'=>could not make animation from animated gif source, 
   );
    function gifencoder($gif_src,$gif_dly=100,$gif_lop=0,$gif_dis=0, $gif_red=0,$gif_grn=0,$gif_blu=0,$gif_mod='bin'){
        if(!is_array($gif_src)&&!is_array($gif_tim)){
            printf(%s: %s,$this->ver,$this->err['err00']);
            exit(0);
        }  
        $this->lop=($gif_lop>-1)?$gif_lop:0;
        $this->dis=($gif_dis>-1)?(($gif_dis        $this->col=($gif_red>-1&&$gif_grn>-1&&$gif_blu>-1)?($gif_red |($gif_grn
        for($i=0,$src_count=count($gif_src);$i            if(strtolower($gif_mod)==url){
                $this->buf[]=fread(fopen($gif_src [$i],rb),filesize($gif_src [$i]));
           }elseif(strtolower($gif_mod)==bin){
                $this->buf [ ]=$gif_src [ $i ];
           }else{
                printf(%s: %s(%s)!,$this->ver,$this->err [ 'err02' ],$gif_mod);
                exit(0);
           }  
            if(substr($this->buf[$i],0,6)!=gif87a&&substr($this->buf [$i],0,6)!=gif89a){
                printf(%s: %d %s,$this->ver,$i,$this->err ['err01']);
                exit(0);
           }  
            for($j=(13+3*(2buf[$i]{10})&0x07))),$k=true;$k;$j++){
                switch($this->buf [$i]{$j}){
                    case !:  
                        if((substr($this->buf[$i],($j+3),8))==netscape){
                                printf(%s: %s(%s source)!,$this->ver,$this->err ['err03'],($i+1));
                                exit(0);
                       }  
                        break;
                    case ;:  
                        $k=false;
                    break;
               }  
           }  
        }  
        gifencoder::gifaddheader();
        for($i=0,$count_buf=count($this->buf);$i            gifencoder::gifaddframes($i,$gif_dly[$i]);
       }  
        gifencoder::gifaddfooter();
    }  
    function gifaddheader(){
        $cmap=0;
        if(ord($this->buf[0]{10})&0x80){
            $cmap=3*(2buf [0]{10})&0x07));
            $this->gif.=substr($this->buf [0],6,7);
            $this->gif.=substr($this->buf [0],13,$cmap);
            $this->gif.=!\377\13netscape2.0\3\1.gifencoder::gifword($this->lop).\0;
        }  
    }  
    function gifaddframes($i,$d){
        $locals_str=13+3*(2 buf[$i]{10})&0x07));
        $locals_end=strlen($this->buf[$i])-$locals_str-1;
        $locals_tmp=substr($this->buf[$i],$locals_str,$locals_end);
        $global_len=2buf [0]{10})&0x07);
        $locals_len=2buf[$i]{10})&0x07);
        $global_rgb=substr($this->buf[0],13,3*(2buf[0]{10})&0x07)));
        $locals_rgb=substr($this->buf[$i],13,3*(2buf[$i]{10})&0x07)));
        $locals_ext=!\xf9\x04.chr(($this->dis>0)&0xff).chr(($d>>8)&0xff).\x0\x0;
        if($this->col>-1&&ord($this->buf[$i]{10})&0x80){
            for($j=0;$jbuf[$i]{10})&0x07));$j++){
                if(ord($locals_rgb{3*$j+0})==($this->col>> 0)&0xff&&ord($locals_rgb{3*$j+1})==($this->col>> 8)&0xff&&ord($locals_rgb{3*$j+2})==($this->col>>16)&0xff){
                    $locals_ext=!\xf9\x04.chr(($this->dis>0)&0xff).chr(($d>>8)&0xff).chr($j).\x0;
                    break;
               }  
           }  
        }  
        switch($locals_tmp{0}){
            case !:  
                $locals_img=substr($locals_tmp,8,10);
                $locals_tmp=substr($locals_tmp,18,strlen($locals_tmp)-18);
                break;
            case ,:  
                $locals_img=substr($locals_tmp,0,10);
                $locals_tmp=substr($locals_tmp,10,strlen($locals_tmp)-10);
                break;
        }  
        if(ord($this->buf[$i]{10})&0x80&&$this->img>-1){
            if($global_len==$locals_len){
                if(gifencoder::gifblockcompare($global_rgb,$locals_rgb,$global_len)){
                    $this->gif.=($locals_ext.$locals_img.$locals_tmp);
                }else{
                    $byte=ord($locals_img{9});
                    $byte|=0x80;
                    $byte&=0xf8;
                    $byte|=(ord($this->buf [0]{10})&0x07);
                    $locals_img{9}=chr($byte);
                    $this->gif.=($locals_ext.$locals_img.$locals_rgb.$locals_tmp);
                }  
            }else{
                $byte=ord($locals_img{9});
                $byte|=0x80;
                $byte&=0xf8;
                $byte|=(ord($this->buf[$i]{10})&0x07);
                $locals_img {9}=chr($byte);
                $this->gif.=($locals_ext.$locals_img.$locals_rgb.$locals_tmp);
            }  
        }else{
            $this->gif.=($locals_ext.$locals_img.$locals_tmp);
        }  
        $this->img=1;
    }  
    function gifaddfooter(){
        $this->gif.=;;
    }  
    function gifblockcompare($globalblock,$localblock,$len){
        for($i=0;$i            if($globalblock{3*$i+0}!=$localblock{3*$i+0}||$globalblock{3*$i+1}!=$localblock{3*$i+1}||$globalblock{3*$i+2}!=$localblock{3*$i+2}){
                return(0);
           }  
       }  
        return(1);
    }  
    function gifword($int){
       return(chr($int&0xff).chr(($int>>8)&0xff));
    }  
    function getanimation(){
        return($this->gif);
    }  
}具体使用方法和原来基本一致,只是不要传type参数,因为默认动态必须是gif格式,另外图片宽度不能小于60。    /**
     * 生成验证码
     * @access public
     * @return void
     */    
    public function verify(){
        import(org.util.image);
        image::buildactiveimageverify(4,1);
    }   
ad:真正免费,域名+虚机+企业邮箱=0元
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product