为什么这段代码不起作用?
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<?php
header('Content-type: image/png');
$myImage = imagecreate(200, 100);
$myGray = imagecolorallocate($myImage, 204, 204, 204);
$myBlack = imagecolorallocate($myImage, 0, 0, 0);
imageline($myImage, 15, 35, 120, 60, $myBlack);
imagepng($myImage);
imagedestroy($myImage);
?>
</body>
</html>
我总是收到错误The image cannot be displayed because it contains errors.
。我已经在php.ini中启用php_gd2.dll
和memory_limit
也是128M。如果我删除header('Content-type: image/png');
我没有得到错误,但我也没有看到图像。我只看到了这一点: -
‰PNG ��� IHDR���È���d���ùHíH���PLTEÌÌÌ���Ó33d���MIDATH‰c
£Àx�§” Nf*k²Ã)Ãø�§”•5}À)ÅS†ÚšpJUà”a§²¦œ2ÔŽw<špJ‚Q0 †;�� uTBúŸ����IEND®B
,`
答案 0 :(得分:27)
你不能在header()之前输出任何内容。只需使用<?php
启动文档,然后使用显示图像的代码。跳过html标签。甚至不要在header()之前写一个空白行。
如果要在您的html文档中显示图像,则必须在两个文件中进行。一,称它为例如image.php,只包含包含标题的php代码。第二个文件,称为show.php或show.html,包含您喜欢的HTML代码,包括<img src="image.php" alt="Your generated image" />
。
答案 1 :(得分:11)
如果您对输出进行base64编码,则可以使用Data URI scheme直接使用该图像。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<?php
$myImage = imagecreate(200, 100);
$myGray = imagecolorallocate($myImage, 204, 204, 204);
$myBlack = imagecolorallocate($myImage, 0, 0, 0);
imageline($myImage, 15, 35, 120, 60, $myBlack);
ob_start();
imagepng($myImage);
printf('<img src="data:image/png;base64,%s"/>',
base64_encode(ob_get_clean()));
imagedestroy($myImage);
?>
</body>
</html>
请注意,并非所有浏览器都支持数据URI(猜猜哪些)。
答案 2 :(得分:3)
您应该只输出 图像。您正在输出一堆标签。具体地
&lt;!DOCTYPE HTML PUBLIC“ - // W3C // DTD HTML 4.01 Transitional // EN“&gt;
<title></title> </head> <body>
然后将图像作为二进制文件。如果您想看到这个,请wget
来自您服务器的页面,并尝试在编辑器中打开它。您的代码应从<?php
开始。
删除标题会删除通知客户端这是一个图像,因此它会尝试将其作为文本打印出来。
答案 3 :(得分:3)
尝试使用PHP从他们的Graph API输出jpg的Facebook个人资料图片时, 我注意到如果使用UTF-8编码保存PHP文件 - 返回了此错误, 但如果文件是用ANSI编码保存的 - 然后它运作正常。
答案 4 :(得分:3)
如果您遇到此问题,请尝试删除脚本开头和php标记之间的任何空格字符
> <?php
我花了几个小时才意识到这一点。现在它工作正常。发生这种情况是因为文件上的任何字符都会改变png格式。这对我很有用。
答案 5 :(得分:3)
即使您认为已从header()之前删除了所有文本,您的PHP文件也可能包含Byte Order Marker
您在编辑器中看不到它,但您的浏览器会看到它并认为图像已损坏。您需要采取适合您的编辑器的步骤来删除任何BOM。
答案 6 :(得分:2)
这就是你所需要的。您无法打印任何其他内容,因为它需要看起来像它自己的文件。您可以调用此image.php并将其传递给变量以定义要输出的图像。
<?php
header('Content-type: image/png');
$myImage = imagecreate(200, 100);
$myGray = imagecolorallocate($myImage, 204, 204, 204);
$myBlack = imagecolorallocate($myImage, 0, 0, 0);
imageline($myImage, 15, 35, 120, 60, $myBlack);
imagepng($myImage);
imagedestroy($myImage);
?>
答案 7 :(得分:2)
我将PHP脚本隔离到它自己的文件(image.php
)中并且工作正常:我有一个带有黑色斜线的灰色矩形。您的问题是尝试将其嵌入HTML文件中。
您需要在自己的单独文件中使用PHP(就像我所做的那样,将其称为image.php
或根据您的需要进行更多描述)然后创建HTML文件,如下所示:
<html>
<head>
<title>Document Title</title>
</head>
<body>
<img src="image.php" alt="" />
</body>
</html>
然后你应该得到你想要的输出。
答案 8 :(得分:0)
我有同样的问题,解决方案是将代码的字符集从UTF-8更改为ansi或反之。如果服务器设置为UTF-8并且您的代码位于ansi中,则此操作无效,如果您的代码位于ansi中且服务器也未配置为UTF-8。
答案 9 :(得分:0)
如果您使用Filezilla
上传网页,请务必选择转移类型为'Auto/Binary'
。
转移 - &gt;转移类型 - &gt;自动/二进制。