今天使用代码进行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
$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;
}