今天使用代码进行PHP生成校验码功能的实现,发现firefox一直提示“图像.......因其本身有错无法显示”的问题,作者也提示了说“如果浏览器显示“图像XXX因其本身有错无法显示”,可尽量去掉文中空格”,但把代码中所有空格都去掉了还是不能显示检验图片。
网上大部分的解决方案也是将“<?”这句代码前的空格回车一切都删掉以防止有html输出,但这根本解决不了我的问题,
后来看到有人在这句代码前使用ob_clean()清除输出,结果一试之下果然成功。
现将原代码修改后贴到下面,以备不时之需:
(请仔细阅读createCold方法)
class validCode{ //可以控制产生几个字符! private $width = 0; private $height = 0; function createCode(){ //$width = 20 + 10*$len; //$img1 = ImageCreateTrueColor($width,20); header("content-type:image/png");//也可以是jpeg,或png $n = rand(1,5); $type =rand(1,2); if($type == 1){ $img1 = imageCreateFromgif("./web/back/images/captcha_bg{$n}.gif"); } else{ $img1 = imageCreateFromjpeg("./web/back/images/captcha_bg{$n}.jpg"); } $this->width = imagesx($img1); $this->height = imagesy($img1); $color2 = ImageColorAllocate($img1, rand(0,255),rand(0,255),rand(0,255)); $this->AddGanrao($img1, $color2);//画干扰线 $validCode = $this->getValidCode();//获得字符 imagestring($img1, 10, 40,3, $validCode, $color2);//写字符 //下面这个函数是重点!!!!!!!!!!!! ob_clean(); ImagePng($img1); imagedestroy($img1); return $validCode; } //添加干扰 点 线 private function AddGanrao($img, $color){ //添加6个干扰线 for($i = 1; $i < 4; $i++){ $x1 = rand(0,$this->width-1); $y1 = rand(0,$this->height-1); $x2 = rand(0,$this->width-1); $y2 = rand(0,$this->height-1); imageLine($img, $x1,$y1, $x2, $y2, $color); } } private function getValidCode(){ $arr=array("+","-","*"); $num1=rand(1000,9999); $oper=$arr[rand(1,4)]; $num2=rand(1000,9999); $str1=$num1.$oper.$num2; switch($oper){ case "+": $_SESSION['code'] = $num1+$num2; //存入session中,以备登录验证时使用! break; case "-": $_SESSION['code'] = $num1-$num2; //存入session中,以备登录验证时使用! break; case "*": $_SESSION['code'] = $num1*$num2; //存入session中,以备登录验证时使用! break; } return $str1; }