Вывод изображения PHP HTML

на PHP manual на base64_encode() Я видел следующий скрипт для вывода изображения.

<?php

$imgfile = "test.gif";

$handle = fopen($filename, "r");

$imgbinary = fread(fopen($imgfile, "r"), filesize($imgfile));

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

?>

но как можете ли вы вывести изображение, динамически созданное с помощью GD?

Я попытался это:

$im = imagecreatetruecolor(400, 400);

imagefilledrectangle($im, 0, 0, 200, 200, 0xFF0000);
imagefilledrectangle($im, 200, 0, 400, 200, 0x0000FF);
imagefilledrectangle($im, 0, 200, 200, 400, 0xFFFF00);
imagefilledrectangle($im, 200, 200, 400, 400, 0x00FF00);

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

почему это не работает?

кажется, работает в IE а не в Firefox. Как я могу сделать это кросс-браузер?

4 ответов


хорошо, извините, я думал слишком быстро:)

imagepng() выведет поток необработанных данных напрямую в браузер, поэтому вы должны использовать ob_start() и другие ручки буферизации выхода для того чтобы получить его.

вы тут:

ob_start();
imagepng($yourGdImageHandle);
$output = ob_get_contents();
ob_end_clean();

то есть - вам нужно использовать $output переменной для вас


, потому что imagepng выводит bool или поток изображений непосредственно на выход.
Итак, чтобы получить данные изображения, вы должны использовать выходные буферы следующим образом:

ob_start();
imagepng($im);
$image = ob_get_contents();
ob_end_clean();
echo '<img src="data:image/png;base64,'.base64_encode($image).'" />';

скорее всего потому, что data: схема URI чрезвычайно ограничена и хороша в использовании, если нет абсолютно никакого способа обойти ее.

в Internet Explorer, например, это не работает вообще до IE 8; и там есть глобальное ограничение в 32 килобайта для данных: URIs.


сначала вы должны сохранить изображение как PNG, а затем прочитать его, чтобы получить его содержимое в качестве значения.

http://www.php.net/manual/en/function.imagepng.php

imagepng () не возвращает PNG-файл. Он выводит его непосредственно в браузере, а затем возвращает логическое значение успеха или неудачи.

(от php.net:) PHP внутренне работает с временным файлом при отправке изображения в браузер, поэтому вы ничего не получите, позвонив imagepng() дважды.