2010-08-02 80 views
14

为什么不工作的代码?无法显示图像,因为它包含错误

<!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_gd2.dllmemory_limit在php.ini中也是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,`

+1

小心PHP错误报告,特别是自5.4以来。错误不会打印在屏幕上,但会对图像产生错误。尝试'error_reporting(0);'在你的代码的顶部,为我工作。 – Chaoley 2015-03-15 08:12:54

回答

23

你切不可头之前任何输出()。只需从<?php开始文档,然后显示图像的代码。跳过html标签。甚至不要在header()之前写一个空白行。

如果你想显示你的HTML文档中的图像,你必须这样做在两个文件中。其一,将其称为例如image.php,仅包含包含头部的php代码。第二个文件叫做show.php或show.html,包含你喜欢的html代码,包括<img src="image.php" alt="Your generated image" />

+0

对不起,我不明白。我需要做什么改变? header()已经是php的第一行了。如果你的意思是我应该删除'html','head'等,我也试过。如果我这样做,我仍然'图像包含错误' – TCM 2010-08-02 08:03:26

+0

感谢工作:) – TCM 2010-08-02 08:04:07

+0

@Nitesh你不必有两个文件。 [请参阅下面的内联解决方案的答案](http://stackoverflow.com/questions/3385982/the-image-cannot-be-displayed-because-it-contains-errors/3386050#3386050)。拥有两个文件更合理可靠。 – Gordon 2010-08-02 08:39:43

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

你应该输出图像。你正在输出一堆标签。具体地说

< DOCTYPE HTML PUBLIC! “ - // W3C // DTD HTML 4.01过渡// EN”>

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

,然后将图像作为二进制。如果你想看到这个,wget从你的服务器的页面,并尝试在编辑器中打开它。你的代码应该从<?php开始。

删除页眉摆脱了通知给客户,这是一个图像,它会尝试打印出来为文本。

9

如果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(猜测哪个)。

+1

+1。与其他答案不同。 – 2010-08-02 12:03:51

+0

有趣的变体。你能控制网页浏览器缓存这张图片的方式吗? – Johan 2010-08-02 12:26:41

+1

@Johan图像不是这种方法的外部资源。不会有过期的标题或其他内容。它是提供页面上的文本。适用于该页面的任何缓存都将应用于图像。 – Gordon 2010-08-02 12:41:03

2

我孤立PHP脚本到自己的文件(image.php),它工作得很好:我买了一个黑色斜线一个灰色的矩形。您的问题是试图将其嵌入到HTML文件中。

你需要在它自己的,独立的文件PHP(像我一样,把它image.php或更多的东西的描述你的需求),然后创建一个HTML文件,如下所示:

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

你应该把你的然后需要的输出。

+0

那么,不一定在它自己的文件。只是输出不应该混合使用HTML和PNG。 – 2010-08-02 12:03:16

2

虽然试图输出一个Facebook的个人资料图片的JPG从图形API,使用PHP, 我注意到,如果PHP文件保存使用UTF-8编码 - 返回该错误, 但如果该文件是用ANSI编码保存 - 然后它工作正常。

+0

谢谢Yuval,这一切都解决了我的问题。 PHP文件的编码! – Alexar 2013-04-02 18:22:48

2

如果你有这个问题,尝试删除之间的开始脚本和PHP的标签

> <?php 

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

0

我有同样的问题,解决方案是将代码的字符集从UTF-8更改为ansi或viceversa。如果服务器设置为UTF-8并且您的代码位于ansi中,则这不起作用,并且您的代码在ansi中并且服务器配置为UTF-8。

3

即使你认为你头之前已删除所有文本从()你的PHP文件可能包含Byte Order Marker

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

0

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

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

相关问题