无法显示图像,因为它包含错误

时间:2010-08-02 07:58:49

标签: php

为什么这段代码不起作用?

<!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.dllmemory_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,`

10 个答案:

答案 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;自动/二进制。