1

我如何让它加载?现在,它根本没有显示任何图像......我不太擅长创建验证码,因为我通常从不这样做。

验证码.php:

<?php
$string = '';
for ($i = 0; $i < 5; $i++) {
    // this numbers refer to numbers of the ascii table (lower case)  
    $string .= chr(rand(97, 122));
}
$image = imagecreatetruecolor(170, 60);
$color = imagecolorallocate($image, 200, 100, 90); // red
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,399,99,$white);
imagettftext ($image, 30, 0, 10, 40, $color, ASSETPATH."arial.ttf", $string);
header("Content-type: image/png");
imagepng($image);
?>

注册.php:

<?php echo '<img src="'.ASSETPATH.'img/captcha.php" />'; ?>

我的资产路径是正确的,因为我在其他地方使用它并且加载得非常好。这个项目的 MVC 格式是否以某种方式搞砸了?

4

2 回答 2

0

如何使用其中一种验证码服务,如 recaptcha?

于 2012-12-07T23:06:16.390 回答
0

从您ASSETPATH对图像 URI 以及 imagettftext 中的字体文件路径的使用来看,我只能假设您的字体文件存储在与图像相同的路径中?

如果不是这种情况,或者无法在此处打开文件,PHP 将抛出imagettftext(): Invalid font filename. 如果在您的 php.ini 中将display_errors设置为On(您可以检查phpinfo来验证这一点),这意味着错误消息将与您的图像数据一起发送到输出流(即损坏图像数据并导致您的浏览器不显示图片)。这也将防止标头被修改,因为错误会在您调用标头之前发生。

但是,如果 display_errors 没有打开并且 PHP 找不到您提供的字体文件,或者由于任何原因(例如权限)无法打开它,结果将是一个空白的 170x60 PNG 图像。

如果我在本地测试您的代码,它证明可以按预期工作,只要我为 PHP 提供我的 truetype 字体文件的正确绝对路径。

例如,我的系统上有一些 truetype 字体存储在/usr/share/fonts/truetype/,这绝对不在我的 webroot 中,因为我通常不会将我的字体文件保存在那里。另请注意,我的 PHP 用户有足够的权限从该路径读取。

现在,如果我为 PHP 提供我想使用的 truetype 字体文件的正确绝对路径,我会使用您的代码获得以下图像...

$string = '';
for ($i = 0; $i < 5; $i++) {
    // this numbers refer to numbers of the ascii table (lower case)
    $string .= chr(rand(97, 122));
}
$image = imagecreatetruecolor(170, 60);
$color = imagecolorallocate($image, 200, 100, 90); // red
$white = imagecolorallocate($image, 255, 255, 255);
imagefilledrectangle($image,0,0,399,99,$white);
imagettftext ($image, 30, 0, 10, 40, $color, '/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-ExtraLight.ttf', $string);
header("Content-type: image/png");
imagepng($image);

上述代码的图像输出

为了进一步调试,您应该尝试运行自行生成图像的 PHP 脚本,打开 display_errors 并将error_reporting设置为-1,如果确实是您的字体文件是问题,您将看到这个在您的 error_log 或在使用 display_errors 测试该脚本期间显示的错误输出中。

于 2012-12-08T03:13:56.610 回答