Можно ли отобразить изображение, созданное с помощью PHP / GD, без сохранения и без использования внешнего PHP с заголовком изображения? - PullRequest
10 голосов
/ 11 января 2012

Я пытаюсь создать способ показать изображение, созданное с помощью PHP / GD, в режиме ООП. Для этого я создал класс, который, помимо прочего, создает образ. Примерно так:

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

Я попытался создать функцию в классе, которая бы выводила изображение. Примерно так:

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

но это не сработало. Я тоже пробовал

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

но это тоже не сработало. Идея состояла в том, чтобы просто вызвать функцию из HTML. Как это:

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

Я в этом ошибаюсь? Есть ли способ сделать то, что я хочу? Я попытался придумать способ использования img = 'mycode.php' , но он не работает для меня, потому что класс должен быть создан до загрузки страницы, а изображение появляется на полпути стр.

Спасибо.

Ответы [ 2 ]

31 голосов
/ 11 января 2012

Во-первых, вам нужно вставить второй параметр в imagejpeg(), чтобы 100 был параметром качества.Затем вам нужно base64-кодировать необработанные байты :

    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 ) . "' />";

    }

Для data:image/jpeg;base64 требуется, чтобы необработанные байты были закодированы как base64 .

Кроме того, я бы предложил сделать переменную $image protected, поскольку я предполагаю, что она создается и поддерживается исключительно внутри MyClass.

1 голос
/ 23 июля 2013

Одна строка кода, решите меня после 3 часов слепого поиска!

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

...