功夫不负有心人,修改jake发的验证码终于显示出图片了

#1 prince

http://speedphp.com/bbs/thread-286-1-1.html之前用这个帖子里边jake发的,但是一直没使用成功,现在我把这个类放到sp3的控制器里边,使用起来更方便(不必import就可以用),controller/Verify.php代码如下:
//图片验证码类
class Verify extends spController{ //原文件中这行为class Verify{
    private $im;//图像资源
    private $width;//图片宽度
    private $height;//图片高度
    private $bgcolor;//背景颜色
    private $point_num;//在图像上所画点的个数
    private $point_color;//干扰像素颜色
    private $line_num;//在图像上所画线的条数
    private $line_color;//干扰线条颜色
    private $font_num;//验证字符个数
   
    function __construct(){
    }
   
    //设定图像大小
    function set_size(){
        if(empty($this->font_num)){
            $this->font_num=5;//原文件中这行为$this->font_num=4;
        }
        $this->width=$this->font_num*12+5;// 根据字符计算图像宽度,原来为+4
        $this->height=20;
    }
   
    //建立图像
    function create_pic(){
        $this->im=imagecreate($this->width,$this->height);
        imagecolorallocate($this->im,200,200,200);
    }
   
    //设置干扰点
    function set_point(){
        if(empty($this->point_num)){
            $this->point_num=50;
        }
        for($i=0;$i<$this->point_num;$i++){
            $this->point_color=imagecolorallocate($this->im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//生成干扰像素颜色
            imagesetpixel($this->im,$this->width,$this->height,$this->point_color);//生成干扰像素
        }
    }
        
    //设置干扰线条
    function set_line(){
        if(empty($this->line_num)){
            $this->line_num=2;
        }
        for($i=0;$i<$this->line_num;$i++){
            $this->line_color=imagecolorallocate($this->im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));//生成干扰线条颜色
            imageline($this->im,mt_rand(0,$this->width),mt_rand(0,$this->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$this->line_color);
        }
    }
   
    //生成随机字符,并且MD5加密
    function ver_str(){
        $string=strtoupper(md5(mt_rand(0,8)));// 用MD5加密随机产生的数字
        if(empty($this->font_num)){
            $this->font_num=4;
        }
        return substr($string,0,$this->font_num);
    }
   
   
    //写入验证字符
    function show(){
        @ob_end_clean(); //清除之前出现的多余输入,这行原来没有的
        $this -> set_size();//设置图像大小
        $this -> create_pic();//建立图像
        $string = $this -> ver_str();//得到随时字符
        for($i = 0;$i < $this -> font_num;$i++){
            $font_color=imagecolorallocate($this->im,mt_rand(100,150),mt_rand(100,150),mt_rand(100,150));
            imagestring($this->im,5,$i*10+8,mt_rand(1,7),$string[$i],$font_color);
        }
        $this -> set_point();//绘制干扰点
        $this -> set_line();//绘制干扰线
        //header("Contetn-type:image/png");
        imagepng($this -> im);//输出图像
        imagedestroy($this -> im);//释放内存
        return $string;
    }
    function verifyCode(){//这个动作原来不在这个文件里的,而是在main控制器里边,现在移来这里
                session_start();
                header("Content-type: image/png");
                $image = $this -> show();//原文件这行为$image=spClass('Verify');
                $_SESSION['verify_code'] = $image;//原文件这行为$_SESSION['verify_code']=$image->show();
        }

}

?>
在模板文件中输验证码的框框后加这个:
看不清楚,点击图片刷新

2010-08-06 22:57:33

#2 jake

那么,你之前遇到的问题其实就很简单了,因为图片输出的action在图片显示之前有输出字符,比如说UTF8BOM或者是某些SESSION或者空格之类的。

现在你直接把类写到控制器上面,这样应该没像之前那样关联了很多其他的函数之类的,所以没有字符输出就正确了。

2010-08-07 09:20:43

#3 prince

回复 2 jake


    之前我检查过编码、图像输出、字符输出、session这些因素,都不存在,所以后来只好改一改大侠你的东西了,呵呵

2010-08-07 10:04:59

#4 jake

可能个人检查的方式不一样,其实原理是相同的。出错总会有原因。

所以如果其他人遇到不能显示验证码图片的时候,可以检查以上我说的几项即可。

另外,最好是直接使用我发的例子代码,不要改动,更不要把自己的东西写上去。先把例子试验成功了,再行加入自己的代码。

2010-08-07 10:26:30

#5 steptt

验证码不显示还要注意是否开启了gd的支持。

2011-04-27 23:35:26

#6 liangjianyuxuan

prince 发表于 2010-8-7 10:04
回复 2 jake
这位兄弟,我用了你说的代码,怎么不显示验证码图片啊?急急急。。。

2012-03-07 16:25:31

#7 jake

liangjianyuxuan 发表于 2012-3-7 16:25
这位兄弟,我用了你说的代码,怎么不显示验证码图片啊?急急急。。。
检查上面说的

2012-03-07 17:49:59

#8 liangjianyuxuan

找到原因了,多谢了啊,问一下在sp中验证码怎么引用验证呢?能否给一个类子?多谢了啊

2012-03-08 09:57:47

#9 prince

可以建SESSION来验证,也可以记录到数据库验证,这是思路

2012-03-29 14:15:05

#10 Bluerainerz

我感觉大家应该明白验证码的意义是什么??是为了防止机器的频繁枚举,是为了不想让程序很容易的认出来,但是我发现大家发的验证码程序基本上都可以被程序识别出来,这又有什么意义呢?

2012-04-15 00:03:45

#11 jake

Bluerainerz 发表于 2012-4-15 00:03
我感觉大家应该明白验证码的意义是什么??是为了防止机器的频繁枚举,是为了不想让程序很容易的认出来,但 ...
验证码的意义在于增加垃圾发帖注册者的“成本”,
即使程序可以认出验证码,但是这也要垃圾者有技术,有耐心去写程序来识别你的验证码,这样已经可以拦截下一大部分垃圾者了。


道理有点像任何一个密码都有可能在50年内被最快的电脑枚举出来,但是这个成本就非常高,所以现在用复杂的密码还是安全的。

2012-04-15 09:16:00

#12 Bluerainerz

jake 发表于 2012-4-15 09:16
验证码的意义在于增加垃圾发帖注册者的“成本”,
即使程序可以认出验证码,但是这也要垃圾者有技术,有 ...
自从你的论坛用了验证码之后还有垃圾帖子吗?

2012-04-16 22:12:47

#13 jake

Bluerainerz 发表于 2012-4-16 22:12
自从你的论坛用了验证码之后还有垃圾帖子吗?
还是有,人工发的。那是没有办法的

2012-04-16 22:44:46

#14 一米八三

怎么回事,代码还是有点问题啊?只要点击刷新,图片就没有办法显示了?这是怎么回事啊?

2012-06-05 16:17:33

#15 jake

一米八三 发表于 2012-6-5 16:17
怎么回事,代码还是有点问题啊?只要点击刷新,图片就没有办法显示了?这是怎么回事啊? ...
搜索我们论坛,找找相关帖子看看

2012-06-05 16:25:51

#16 m648573643

liangjianyuxuan 发表于 2012-3-8 09:57
找到原因了,多谢了啊,问一下在sp中验证码怎么引用验证呢?能否给一个类子?多谢了啊 ...
怎么解决的

2014-10-30 16:19:16