2010-09-12 4 views
10

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

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

+2

Вы использовали MSIE? – BalusC

+0

Нет, firefox. Хм, он работает в IE ... –

+3

У вас есть настоятельная необходимость использования данных: URI? Потому что, если вы этого не сделаете, лучше не использовать их. У них очень много недостатков. Например, IE <8 не поддерживает их вообще. –

ответ

15

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

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

Здесь вы:

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

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

+0

Возможно, но разве он не делает именно это? –

+0

@ Томасз хороший момент! Это оно. +1 –

+0

@ Марк нет, он прав. Если он работает в IE, то, поскольку часть 'img src' игнорируется. Необработанное изображение будет выводиться в браузер, а 'base64_encode' никогда не будет. –

1

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

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

+0

Итак, ваше высказывание делает это по-другому? –

+0

@Mark Какие вам нужны данные: URI в первую очередь? –

+0

Captcha эксперимент. См. Http: // stackoverflow.com/questions/3692969/captcha-encryption –

0

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

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

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

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

+0

Ну, я не хочу сохранять как изображение, но ... –

+1

Вы можете заключить imagepng() между ob_start() и ob_get_contents(); ob_end_clean(); чтобы получить изображение, но он все равно использует временный файл. –

11

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

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