2012-02-21 7 views

risposta

27

Il trucco qui sarà utilizzare il buffer di uscita per acquisire l'output da imagepng(), che invia l'output al browser o un file. Esso non ritorna ad essere memorizzato in una variabile (o base64 codificato):

// 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>'; 

Questo è adattato da un utente in esempio the imagepng() docs.

5

avevo problemi base alle ob_get_contents() quando si utilizza PHP con AJAX, così ho provato questo:

$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); 

questo salva un file immagine temporaneo sul server e poi viene rimosso dopo che è stato codificato e eco fuori.

0

Se non si desidera archiviare in un file esplicito e si sta già utilizzando ob_start() per qualcos'altro (quindi non è possibile utilizzare ob_start per questo caso senza molti refactoring), è possibile definire il proprio wrapper di flusso che memorizza un flusso in uscita a una variabile.

È possibile utilizzare stream_wrapper_register per registrare un nuovo wrapper di flusso e implementare il suo metodo stream_write per scriverlo in una variabile il cui valore è possibile recuperare in seguito. Quindi si passa questo flusso (in realtà è sufficiente passare l'URI per questo flusso) a imagepng. imagepng volendo chiudere lo stream non ti disturberà, purché il wrapper stream non distrugga i dati quando viene chiuso (metodo stream_close chiamato).