Мога ли да покажа изображение, създадено с PHP/GD без запазване и без използване на външен PHP със заглавка на изображението?

Опитвам се да създам начин да покажа изображение, създадено с PHP/GD, по OOP начин. За да постигна това, създадох клас, който, наред с други неща, създава изображение. Нещо като това:

<?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
Благодаря SteAp. Опитах, но когато погледна 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