tags:

views:

119

answers:

5

Hello,

Why is this code not working ?

<!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>

I always get error The image cannot be displayed because it contains errors.. I've already enabled php_gd2.dll and memory_limit in php.ini is also 128M. If i remove header('Content-type: image/png'); i don't get the error but i don't see the image either. All i see is this :-

‰PNG ��� IHDR���È���d���ùHíH���PLTEÌÌÌ���Ó33d���MIDATH‰c£Àx�§” Nf*k²Ã)Ãø�§”•5}À)ÅS†ÚšpJUà”a§²¦œ2ÔŽw<špJ‚Q0 †;�� uTBúŸ����IEND®B‚ `

+4  A: 

You must not output anything before header(). Just start your document with <?php followed by the code for displaying the image. Skip the html tags. Do not even write a single blankline before header().

If you want to display an image inside the html document of yours, you must do it in two files. One, call it for example image.php, containing only the php code including the header. The second file, call it show.php or show.html, includes the html code you like, including <img src="image.php" alt="Your generated image" />.

Johan
Sorry i didn't understand. What changes do i need to do? header() is already the first line of php. If you mean i should remove `html`,`head` etc, i tried that too. If i do that i still get `image contains errors`
Ankit Rathod
Thanks worked :)
Ankit Rathod
@Johan @Nitesh you dont have to have two files. [See my answer below for an inline solution](http://stackoverflow.com/questions/3385982/the-image-cannot-be-displayed-because-it-contains-errors/3386050#3386050). It's just more sensible and reliable to have two files.
Gordon
+1  A: 

This is all you need. You can not print anything else because it needs to look like it's own file. You could call this image.php and pass it a variable to define which image to output.

<?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);
?>
Shane Reustle
+2  A: 

You should output only the image. You are outputting a bunch of tags. Specifically

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

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

and then the image as a binary. If you want to see this, wget the page from your server and try opening it in an editor. Your code should start at the <?php.

Removing the header gets rid of the notification to the client that this is an image so it will try out print it out as text.

Noufal Ibrahim
+4  A: 

If you base64 encode the output, you could use the image directly with a 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>

Note that Data URIs are not supported by all browsers (guess which).

Gordon
+1. An answer different from the rest.
Noufal Ibrahim
Interesting variant. Can you control the way the web browser should cache this image?
Johan
@Johan The image is not an external resource with this approach. There will be no expiry headers or something. It's text on the served page. Any caching that applies to the page, will apply to the image.
Gordon
+1  A: 

I isolated the PHP script into its own file (image.php) and it worked fine: I got a grey rectangle with a black slanted line. Your issue is trying to embed this within a HTML file.

You need the PHP in its own, separate file (as I did, call it image.php or something more description to your needs) and then create a HTML file as follows:

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

You should get your desired output then.

Martin Bean
Well, not necessarily in it's own file. Just that the output shouldn't mix HTML and the PNG.
Noufal Ibrahim