【问题标题】:The image cannot be displayed because it contains errors图像无法显示,因为它包含错误
【发布时间】:2011-03-24 02:15:16
【问题描述】:

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

<!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&lt;špJ‚Q0 †;�� uTBúŸ����IEND®B,`

【问题讨论】:

  • 注意 PHP 错误报告,尤其是从 5.4 开始。该错误不会打印在屏幕上,但会引发图像错误。试试'error_reporting(0);'在您的代码顶部,为我工作。

标签: php


【解决方案1】:

您不能在 header() 之前输出任何内容。只需以&lt;?php(作为第一个文件字符)开始您的文档,然后是显示图像的代码。跳过 HTML 标签。 不要在 header() 之前写一个空行。

如果要在自己的 html 文档中显示图像,则必须在两个文件中进行。一,例如调用它 image.php,只包含 PHP 代码,包括标题。第二个文件,称为 show.phpshow.html,包含您喜欢的 HTML 代码,包括 &lt;img src="image.php" alt="Your generated image" /&gt;

【讨论】:

  • 对不起,我不明白。我需要做什么改变? header() 已经是 php.ini 的第一行了。如果您的意思是我应该删除htmlhead 等,我也尝试过。如果我这样做,我仍然会得到image contains errors
  • @Nitesh 你不必有两个文件。 See my answer below for an inline solution。拥有两个文件更加明智和可靠。
  • 删除文件开头的多余空格为我解决了错误:)
【解决方案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);
?>

【讨论】:

    【解决方案3】:

    您应该只输出图像。您正在输出一堆标签。具体

    渡//EN">

        <title></title>
    </head>
    <body>
    

    然后将图像作为二进制文件。如果您想查看此内容,请wget 服务器上的页面并尝试在编辑器中打开它。您的代码应以&lt;?php 开头。

    删除标题可以消除向客户端发出的关于这是图像的通知,因此它会尝试将其作为文本打印出来。

    【讨论】:

      【解决方案4】:

      如果您对输出进行 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(猜猜看)。

      【讨论】:

      • 有趣的变体。你能控制网络浏览器缓存这张图片的方式吗?
      • @Johan 使用这种方法,图像不是外部资源。不会有过期标题或其他东西。它是服务页面上的文本。应用于页面的任何缓存都将应用于图像。
      【解决方案5】:

      我将 PHP 脚本隔离到它自己的文件 (image.php) 中,它运行良好:我得到了一个带有黑色斜线的灰色矩形。您的问题是尝试将其嵌入 HTML 文件中。

      您需要将 PHP 放在自己的单独文件中(就像我所做的那样,将其称为 image.php 或根据您的需要进行更多描述),然后按如下方式创建一个 HTML 文件:

      <html>
        <head>
          <title>Document Title</title>
        </head>
        <body>
          <img src="image.php" alt="" />
        </body>
      </html>
      

      你应该得到你想要的输出。

      【讨论】:

      • 好吧,不一定在它自己的文件中。只是输出不应混合 HTML 和 PNG。
      【解决方案6】:

      在尝试使用 PHP 从他们的 Graph API 输出 Facebook 个人资料图片的 jpg 时, 我注意到如果 PHP 文件以 UTF-8 编码保存 - 返回此错误, 但如果文件是用 ANSI 编码保存的 - 然后它工作正常。

      【讨论】:

      • 感谢 Yuval,这一切都解决了我的问题。 php文件的编码!
      【解决方案7】:

      如果您遇到此问题,请尝试删除脚本开头和 php 标签之间的任何空格字符

      > <?php
      

      我花了几个小时才意识到这一点。现在它工作正常。发生这种情况是因为文件中的任何字符都会改变 png 格式。这对我很有用。

      【讨论】:

        【解决方案8】:

        我遇到了同样的问题,解决方案是将代码的字符集从 UTF-8 更改为 ansi,反之亦然。如果服务器设置为 UTF-8 并且您的代码是 ansi 则不起作用,如果您的代码是 ansi 并且服务器也没有配置为 UTF-8。

        【讨论】:

          【解决方案9】:

          即使你认为你已经删除了 header() 之前的所有文本,你的 PHP 文件也可能包含 Byte Order Marker

          这将在您的编辑器中对您不可见,但您的浏览器会看到它并认为图像已损坏。您需要采取适合您的编辑器的步骤来删除任何 BOM。

          【讨论】:

            【解决方案10】:

            如果您使用Filezilla 上传网页,请确保选择传输类型为'Auto/Binary'

            传输 -> 传输类型 -> 自动/二进制。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2020-06-17
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多