2012-02-21 10 views
15

He creado una imagen con ImagePng(). No quiero a guardar la imagen en el sistema de archivos, pero quiero que la producción en la misma página como base 64 de codificación en línea de imágenes, comoPHP: ¿crea imágenes con ImagePng y las convierte con base64_encode en un solo archivo?

print '<p><img src="data:image/png;base64,'.base64_encode(ImagePng($png)).'" alt="image 1" width="96" height="48"/></p>'; 

que no funciona.

¿Es esto posible en un solo archivo PHP?

¡Gracias de antemano!

Respuesta

27

El truco aquí será utilizar el almacenamiento en búfer de salida para capturar la salida de imagepng(), que envía salida al navegador o a un archivo. No vuelve a ser almacenado en una variable (o base64 codificado):

// Enable output buffering 
ob_start(); 
imagepng($png); 
// Capture the output 
$imagedata = ob_get_contents(); 
// Clear the output buffer 
ob_end_clean(); 

print '<p><img src="data:image/png;base64,'.base64_encode($imagedata).'" alt="image 1" width="96" height="48"/></p>'; 

Este está adaptado a partir de un ejemplo de usuario en the imagepng() docs.

5

tuve problemas utilizando los ob_get_contents() cuando utilice PHP con AJAX, así que intentó esto:

$id = generateID(); //Whereas this generates a random ID number 
$file="testimage".$id.".png"; 
imagepng($image, $file); 
imagedestroy($image); 
echo(base64_encode(file_get_contents($file))); 
unlink($file); 

esto guarda un archivo de imagen temporal en el servidor y luego se retira después de que se codifica y se hizo eco a cabo.

0

Si no desea almacenar en un archivo explícito, y ya está usando ob_start() para otra cosa (por lo que no puede usar ob_start para este caso sin mucha refactorización), puede definir su propia envoltura de flujo esa tienda un flujo de salida a una variable.

Utiliza stream_wrapper_register para registrar un nuevo contenedor de secuencias e implementar su método stream_write para escribirlo en una variable cuyo valor pueda recuperar más adelante. Luego pasa esta secuencia (en realidad, solo necesita pasar el URI para esta secuencia) al imagepng. imagepng que desee cerrar la transmisión no le molestará, siempre que el contenedor de secuencias no destruya los datos cuando se cierra (se llama al método stream_close).

Cuestiones relacionadas