PHP HTML вывод изображения - PullRequest
       5

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

10 голосов
/ 12 сентября 2010

В 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 ]

15 голосов
/ 12 сентября 2010

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

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

Вот вы:

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

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

11 голосов
/ 12 сентября 2010

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

ob_start();
imagepng($im);
$image = ob_get_contents();
ob_end_clean();
echo '<img src="data:image/png;base64,'.base64_encode($image).'" />';
1 голос
/ 12 сентября 2010

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

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

0 голосов
/ 12 сентября 2010

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

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

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

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

...