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


Я пытаюсь создать способ отображения изображения, созданного с помощью 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 ' но это не работает для меня, потому что класс должен быть создан до загрузки страницы, и изображение появится на полпути через страницу.

Спасибо.

 10
Author: Dentra Andres, 2012-01-11

2 answers

Во-первых, вам нужно вставить второй параметр в 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.

 29
Author: SteAp, 2014-03-03 00:42:17

Одна единственная строка кода, реши меня после 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!

Спасибо!

 1
Author: Bruno, 2015-11-01 11:43:28