Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I display an image created with PHP/GD without saving and without using external PHP with image header?

Tags:

php

image

gd

I'm trying to create a way to show an image created with PHP/GD, in an OOP fashion. In order to accomplish that, I created a class that, among other things, creates an image. Something like this:

<?php
    class MyClass 
    {
        public $image;
        function __construct()
        {
           ...
           $this->image = imagecreatetruecolor(100,100);
           $bg = imagecolorallocate($this->image,100,100,100);
           imagefilledrectangle($this->image,0,0,100,100,$bg);
           ...
        }
        ...
    }

    $myvar = new MyClass
?>

I tried to create a function within the class that would output the image. Something like this:

function show()
{
    echo "<img src='" . imagejpeg($this->image,100) . "' />";
}

but it didn't work. I also tried

function show()
{
    echo "<img src='data:image/jpeg;base64," . imagejpeg($this->image,100) . "' />";
}

but this also didn't work. The idea was to simply call the function from the HTML. Like this:

<div id='anyid'>
    <?php $myvar->show(); ?>
</div>

Am I going all wrong on this? Is there a way to accomplish what I want? I tried to think of a way to use the img='mycode.php' but it doesn't work for me because the class has to be created before the page loads and the image appears half way through the page.

Thanks.

like image 943
Dentra Andres Avatar asked Jan 10 '12 23:01

Dentra Andres


2 Answers

First, you need to insert a second parameter to imagejpeg() to allow 100 to be the quality parameter. Then, you need to base64-encode the raw bytes:

    public function show() {

        // Begin capturing the byte stream
        ob_start();

        // generate the byte stream
        imagejpeg($this->image, NULL, 100);

        // and finally retrieve the byte stream
        $rawImageBytes = ob_get_clean();

        echo "<img src='data:image/jpeg;base64," . base64_encode( $rawImageBytes ) . "' />";

    }

The data:image/jpeg;base64 requires the raw bytes to get encoded as base64.

Additionally, I'd propose to make $image a protected variable, since I suppose it is created and maintained solely inside of MyClass.

like image 50
SteAp Avatar answered Nov 20 '22 04:11

SteAp


One single code line, solve-me after 3 hours of blind search!

...
ob_start();
header( "Content-type: image/jpeg" ); <br/>
imagejpeg( $this->img, NULL, $qualidade );<br/>
imagedestroy( $this->img );<br/>
$i = ob_get_clean();<br/>

echo "<img src='data:image/jpeg;base64," . base64_encode( $i )."'>";   //saviour line!

thks!

like image 1
Bruno Avatar answered Nov 20 '22 03:11

Bruno