无法显示图像,因为它包含错误(需要帮助!!)


The image cannot be displayed because it contains errors (Need help!!!)

当我尝试这个代码时,我得到了这个错误:"图像无法显示,因为它包含错误",我不知道如何修复它。

header('Content-type: image/jpeg');
$email= 'example@example.com';
$email_length=strlen($email);
$font_size= 4;
$image_height= imagefontheight($font_size);
$image_width = imagefontwidth($font_size)*$email_length;
$image=imagecreate($image_width, $image_height);
imagecolorallocate($image,255,255,255);
$font_color= imagecolorallocate($image,0,0,0);
imagestring($image,$font_size, 0, 0, $email, $font_color);
imagejpeg($image);

浏览器生成消息"图像包含错误,无法显示"。它从服务器接收的响应的头部表示,响应的主体应该被解释为JPEG图像(image/jpeg)。

JPEG文件的格式(与大多数二进制格式一样)以包含"签名"(用于识别文件为JPEG的字节序列)、图像信息(宽度、高度)、内容长度等的标头开头。

如果脚本在执行过程中产生警告或通知,浏览器会在图像文件的字节之前接收到这些额外内容(它们是由最后一行代码生成的),则浏览器无法找到JPEG签名并报告上面的错误(这是正确的)。

如何调试

删除/注释header()行或将其临时替换为:

header('Content-type: text/plain');

此更改将停止告诉浏览器将内容解释为图像;它将按原样显示它,您可以检查它并查看PHP警告和注意事项(如果有的话)。

在您发现并解决了问题,并且代码不再产生错误消息后,将原始header行放回原处,它应该可以工作了。

其他可能的原因:BOM

如果上面解释的更改没有显示代码产生的任何消息,并且浏览器仍然抱怨收到的内容中有错误,那么请确保PHP文件没有保存为UTF-8和BOM。UTF-8很好,BOM是个问题。

BOM(字节顺序标记)是一个字节序列,它写在文件的最开始,让读取它的程序知道该文件中的字符是如何编码的。这对于UTF-16编码来说是至关重要的,但对于UTF-8来说是完全无用的。然而,许多文本编辑器将其放在文件中,其中一些编辑器可以选择跳过它

BOM表编码一个不可见且不占用空间的特殊空白字符。通过对PHP脚本或其输出的视觉检查无法检测到它。此外,没有办法从PHP代码中处理它,因为如果存在,它会在打开标记<?php之前存储在PHP文件中,PHP解释器会将它与PHP打开和关闭标记之外的任何其他内容一起发送到浏览器。

如何解决

检查代码编辑器的设置,并取消选中"告诉"它在保存文件时使用BOM表的选项(或选中"跳过BOM表"的选项)。

如果没有关于BOM的设置,则将编码更改为ISO-8859-1(也称为ISO-latin1)。此编码不使用BOM,并且对于所有ASCII字符(不带重音符号或变音符号的数字、小写和大写字母、标点符号、括号、数学运算符、直引号和编程语言使用的其他特殊字符),它与UTF-8相同。

更改编码不会以任何方式影响暴露在问题中的代码。

确保库GD已安装

if (extension_loaded('gd') && function_exists('gd_info')) {
    echo "PHP GD library is installed on your web server";
}
else {
    echo "PHP GD library is NOT installed on your web server";
}

检查php打开标记之前是否没有空格,如果使用关闭标记,则检查其后面是否没有空格或任何其他字符。

我不止一次遇到同样的问题,这就是原因。