我制作了一个验证码类来生成验证码。出于某种原因,如果我在类文件本身中创建类的实例,我只能显示图像。否则我一无所获。在firebug中,我看到文件被包含但是它被发送为html,尽管我使用了header("Content-type: image/png");
class.captcha.php
<?php
class captcha
{
public $length=4;
public $width=150;
public $height=50;
public $allowedChar='1234569ACEFGHJKMNPQRSTXZ';
public $font='Arcade.ttf';
public $fontSize=25;
public $fontRed=0;
public $fontGreen=0;
public $fontBlue=104;
public $backgroundRed=204;
public $backgroundGreen=204;
public $backgroundBlue=255;
public $noiseRed=0;
public $noiseGreen=0;
public $noiseBlue=104;
public $noisePercent=5;
/*
** @RETURN IMAGE raw image of captcha
*/
public function create($name)
{
//string
for ($i=0;$i<$this->length;$i++)
{$captcha.= $this->allowedChar[mt_rand(0, strlen($this->allowedChar))];}
//image
$img=imagecreatetruecolor($this->width, $this->height);
//colors
$bgColor=imagecolorallocate($img, $this->backgroundRed, $this->backgroundGreen, $this->backgroundBlue);
$fontColor=imagecolorallocate($img, $this->fontRed, $this->fontGreen, $this->fontBlue);
$noiseColor=imagecolorallocate($img, $this->noiseRed, $this->noiseGreen, $this->noiseBlue);
imagefilledrectangle($img,0,0,$this->width+1,$this->height+1,$bgColor);
//text
for($i=0;$i<strlen($captcha);$i++)
{
$rotate=rand(0, 80)-40;
$offX=$i*$this->fontSize+rand($this->fontSize, $this->fontSize*1.2);
$offY=$this->fontSize+rand($this->fontSize/2, $this->fontSize);;
$letter=$captcha[$i];
imagettftext($img, $this->fontSize, $rotate, $offX, $offY, $fontColor, $this->font, $letter);
}
//add noise
for($i=0;$i<$this->height*$this->width*($this->noisePercent/100);$i++)
{
//noise
$x=rand(0, $this->width);
$y=rand(0, $this->height);
imagesetpixel($img, $x, $y, $noiseColor);
}
$_SESSION[$name]=md5($captcha);
return $img;
}
}
?>
captcha.contact.php
<?php
session_start();
include('class.captcha.php');
$c=new captcha;
header("Content-type: image/png");
imagepng($c->create('contactCaptcha'));
?>
如果有帮助,请链接到上方http://yamikowebs.com/_test/_php/class.captcha.php
错误是The image “http://yamikowebs.com/_test/_php/captcha.contact.php” cannot be displayed because it contains errors.
如果我将capture.contact.php的内容放在class.captcha.php的末尾,那就没问题了。
答案 0 :(得分:1)
我认为解决方案可能是您正在使用PHP的结束标记:
?>
它们不是必需的,但有时是有害的。如果此类标记后面有任何符号,则不会发送您尝试发送的标题,并且可能会显示通知(取决于error_reporting设置)。
只需删除结束标记(?>
),这应该没问题。
另外一件事 - 如果脚本需要某些工作(例如您的类文件),请使用require()
代替include()
。
答案 1 :(得分:0)
contact.captcha.php
<?php
include('class.captcha.php');
$c=new captcha;
header("Content-type: image/png");
imagepng($c->create('contactCaptcha'));
?>
session_start()
会发送标题信息,因此一旦删除它就会开始正常工作。