最近遇到一個問題,就是驗證碼在別人的電腦上可以顯示,但是我自己的電腦上去不能。原因找了好久,哈哈,終於找到了!現在給大家分享一下:
程序:
<?php
$w = 80; //設置圖片寬和高
$h = 26;
$str = Array(); //用來存儲隨機碼
$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//隨機挑選其中4個字符,也可以選擇更多,注意循環的時候加上,寬度適當調整
for($i = 0;$i < 4;$i++){
$str[$i] = $string[rand(0,35)];
$vcode .= $str[$i];
}
session_start(); //啟用超全局變量session
$_SESSION["vcode"] = $vcode;
$im = imagecreatetruecolor($w,$h);
$white = imagecolorallocate($im,255,255,255); //第一次調用設置背景色
$black = imagecolorallocate($im,0,0,0); //邊框顏色
imagefilledrectangle($im,0,0,$w,$h,$white); //畫一矩形填充
imagerectangle($im,0,0,$w-1,$h-1,$black); //畫一矩形框
//生成雪花背景
for($i = 1;$i < 200;$i++){
$x = mt_rand(1,$w-9);
$y = mt_rand(1,$h-9);
$color = imagecolorallocate($im,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagechar($im,1,$x,$y,"*",$color);
}
//將驗證碼寫入圖案
for($i = 0;$i < count($str);$i++){
$x = 13 + $i * ($w - 15)/4;
$y = mt_rand(3,$h / 3);
$color = imagecolorallocate($im,mt_rand(0,225),mt_rand(0,150),mt_rand(0,225));
imagechar($im,5,$x,$y,$str[$i],$color);
}
header("Content-type:image/jpeg"); //以jpeg格式輸出,注意上面不能輸出任何字符,否則出錯
imagejpeg($im);
imagedestroy($im);
?>
驗證過,在別人的電腦上能運行,但是我自己的電腦卻無法運行。顯示的結果如下:
原因如下:
首先要聲明一下的是,我以為是gd2庫沒有打開,但用phpinfo查看了,發現打開了。清除了bom,代碼也是頂行開始寫的,因此問題可能出現在代碼上。后來經過研究,發現還是要更改一下程序,要在header前面加上ob_clean()這個語句,這樣就可以運行了。
加在header輸出之前:
ob_clean(); //關鍵代碼,防止出現'圖像因其本身有錯無法顯示'的問題。
header("Content-type:image/jpeg");
這樣問題就得到了解決。
鑒於有些人說我這里有問題,我把改正的代碼和結果給大家看看:
<?php
$w = 80; //設置圖片寬和高
$h = 26;
$str = Array(); //用來存儲隨機碼
$string = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";//隨機挑選其中4個字符,也可以選擇更多,注意循環的時候加上,寬度適當調整
for($i = 0;$i < 4;$i++){
$str[$i] = $string[rand(0,35)];
$vcode .= $str[$i];
}
session_start(); //啟用超全局變量session
$_SESSION["vcode"] = $vcode;
$im = imagecreatetruecolor($w,$h);
$white = imagecolorallocate($im,255,255,255); //第一次調用設置背景色
$black = imagecolorallocate($im,0,0,0); //邊框顏色
imagefilledrectangle($im,0,0,$w,$h,$white); //畫一矩形填充
imagerectangle($im,0,0,$w-1,$h-1,$black); //畫一矩形框
//生成雪花背景
for($i = 1;$i < 200;$i++){
$x = mt_rand(1,$w-9);
$y = mt_rand(1,$h-9);
$color = imagecolorallocate($im,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255));
imagechar($im,1,$x,$y,"*",$color);
}
//將驗證碼寫入圖案
for($i = 0;$i < count($str);$i++){
$x = 13 + $i * ($w - 15)/4;
$y = mt_rand(3,$h / 3);
$color = imagecolorallocate($im,mt_rand(0,225),mt_rand(0,150),mt_rand(0,225));
imagechar($im,5,$x,$y,$str[$i],$color);
}
ob_clean();//原來的程序沒有這一欄
header("Content-type:image/jpeg"); //以jpeg格式輸出,注意上面不能輸出任何字符,否則出錯
imagejpeg($im);
imagedestroy($im);
?>
顯示結果如下:
這樣的話,結果是不是很明顯了?