2010-09-12 21 views
10

En el PHP manual para base64_encode(), vi el siguiente script para generar una imagen.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) . '" />'; 

?> 

Pero cómo puede usted salida de una imagen creada dinámicamente con GD?

He intentado esto:

$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)).'" />'; 

Por qué no funciona eso?

Parece que funciona en IE pero no Firefox. ¿Cómo puedo hacerlo cross-browser?

+2

estaba usando MSIE? – BalusC

+0

No, firefox. Hmm, funciona en IE ... –

+3

¿Tiene una necesidad real de usar datos: URI? Porque si no lo haces, es mejor no usarlos. Tienen muchas desventajas. IE <8 no los admite en absoluto, por ejemplo. –

Respuesta

15

Ok, lo siento, estaba pensando demasiado rápido :)

imagepng() voluntad flujo de salida de datos en bruto directamente al navegador, por lo que debe utilizar ob_start() y otra búfer de salida maneja para obtenerlo.

aquí están:

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

Eso es - es necesario utilizar $output variable para que base64_encode() función.

+0

Quizás, ¿pero ya no está haciendo exactamente eso? –

+0

@Tomasz ¡buen punto! Eso es todo. +1 –

+0

@ Marque no, él tiene razón. Si funciona en IE, entonces porque la parte 'img src' se ignora. La imagen sin procesar se enviará al navegador y 'base64_encode' nunca tendrá lugar –

1

Muy probablemente porque el esquema de URI data: es extremadamente limitado y bueno de usar, a menos que no haya absolutamente ninguna forma de evitarlo.

En Internet Explorer, por ejemplo, esto no funciona en absoluto hasta IE 8; y allí, hay un global 32 kilobyte limitation para datos: URI.

+0

¿Así que dices hacerlo de otra manera? –

+0

@Mark ¿Para qué necesitas datos: URIs en primer lugar? –

+0

Experimento de Captcha. Ver http: // stackoverflow.com/questions/3692969/captcha-encryption –

0

Primero debe guardar su imagen como PNG y luego leer para obtener su contenido como un valor.

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

imagepng() no devuelve el archivo PNG. Lo envía directamente al navegador y luego devuelve un booleano que significa éxito o falla.

(desde php.net :) PHP trabaja internamente con un archivo temporal al enviar la imagen al navegador, por lo que no obtendrá nada al llamar a imagepng() dos veces.

+0

Bueno, no quiero guardar como imagen, pero ... –

+1

Puede adjuntar imagepng() entre ob_start() y ob_get_contents(); ob_end_clean(); para obtener la imagen, pero utiliza un archivo temporal de todos modos. –

11

Porque imagepng emite bool o flujo de imagen directamente a la salida.
Por lo tanto, con el fin de obtener datos de imagen que debe utilizar buffers de salida como esta:

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