Подтвердить что ты не робот

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

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

<?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. Как я могу сделать его кросс-браузер?

4b9b3361

Ответ 1

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

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

Здесь вы находитесь:

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

То есть вам нужно использовать переменную $output для вас base64_encode().

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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

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

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