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

Спасибо.


person Dentra Andres    schedule 10.01.2012    source источник
comment
У вас почти получилось с show() - вам просто нужно base64_encode вывод   -  person aknosis    schedule 11.01.2012


Ответы (2)


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

person SteAp    schedule 10.01.2012
comment
Спасибо СтеАп. Я пытался, но когда я смотрю на html-код, я получаю следующее: ‹img src='data:image/jpeg;base64,MQ==' /› - person Dentra Andres; 11.01.2012
comment
Функция imagejpeg() должна быть обернута функциями буферизации вывода для захвата содержимого, вы можете найти файл с именем 100, который содержит ваше изображение в папке вашего веб-сайта, imagejpeg() может только эхо или запись в файл, а не возврат :) - person Scuzzy; 11.01.2012
comment
@Scuzzy Моя вина. Передайте NULL в качестве второго параметра, чтобы разрешить 100 быть третьим параметром. - person SteAp; 11.01.2012
comment
ob_start();imagejpeg($this-›image,null,100);$rawImageBytes = ob_get_clean(); - person Scuzzy; 11.01.2012
comment
@Scuzzy Абсолютно. Ты прав, Сказзи! Спасибо! Тем не менее, передача NULL в качестве второго параметра также важна. - person SteAp; 11.01.2012
comment
Это сработало прекрасно. Большое спасибо. Протестировано на FF9, IE9 и Chrome16. Все идеально. - person Dentra Andres; 11.01.2012
comment
@setnara erdnaxela Добро пожаловать! Получайте удовольствие от кодирования! Не забудьте принять ответ, иначе люди могут перестать отвечать ;-) - person SteAp; 11.01.2012
comment
Для тех, кто хочет понять, какие функции ob_ делают, проверьте эту ссылку http://www.php.net/manual/en/ref.outcontrol.php. По сути, управляйте выводом и фиксируйте все выходные данные php между ob_start и end во внутреннюю переменную. - person Paulo Bueno; 17.12.2016
comment
это не работает в IE6, IE7 http://caniuse.com/#search=Data%20URIs - person behz4d; 05.06.2017

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

спасибо!

person Bruno    schedule 23.07.2013