2011-02-08 21 views
14

Sto usando Imagick lib per apportare alcune modifiche all'immagine originale. Quindi mi piacerebbe inviarlo direttamente al browser senza salvare. C'è un modo per farlo?Uscita immagine grezza da immagine Imagick in PHP

Ho provato a utilizzare Imagick::writeImage('STDOUT') (output vuoto) e 'php: // stdout' con errore "Impossibile scrivere sul file".

Qualche idea? :)

risposta

23

Hai solo bisogno di eco l'oggetto imagick:

$img = new Imagick($file); 
header('Content-Type: image/'.$img->getImageFormat()); 
echo $img; 
+0

Come illustrato nell'esempio n. 1: http://es2.php.net/manual/en/imagick.examples-1.php –

+6

Vorrei andare con 'header ('Content-Type: image /'.$ img- > getImageFormat()); '- ma per il resto molto bello :) – gnud

+0

Sì, è meglio :) – Nabab

-1

Hai provato Imagick::writeImageFile("php://stdout") (non testato)?

+0

Questo sarebbe 'writeImage()', e questo non funziona! – Benjamin

2

Credo che ciò che Schneck ha significato è:

header('Content-Type: '.$mime_type); 
$fp = fopen('php://stdout', 'w+'); 
$image->writeImageFile($fp); 
fclose($fp); 

Questo può causare problemi, soprattutto nelle file di più, così si dovrebbe probabilmente utilizzare:

ob_start(); 
$fp = fopen('php://output', 'w+'); 
$image->writeimagefile($fp); // or writeImagesFile for multipage PDF 
fclose($fp); 
$out = ob_get_clean(); 
header('Content-Length: '.strlen($out)); 
echo $out; 

Questo è testato e funziona ing.

Mi rendo conto che questa è una vecchia domanda. Il motivo per cui sto postando questo è che se vuoi scrivere un PDF multipagina, questa è la soluzione, poiché la soluzione di Nabab funziona solo per immagini singole.

È anche possibile utilizzare (PHP 5.1.0+):

$fp = fopen('php://temp', 'r+'); 
$image->writeimagesfile($fp); 
rewind($fp); 
$out = stream_get_contents($fp); 
header('Content-Length: '.strlen($out)); 
fclose($fp); 
echo $out; 

In questo modo sembra essere più veloce se la vostra versione di PHP lo supporta.

Prima del downvot, il motivo per cui ho aggiunto questo come risposta e non un commento è che non ho sufficiente reputazione per commentare. Spero che vada bene. Volevo solo ottenere questo là nel caso in cui qualcuno ne avesse bisogno.

1

Se si utilizza HHVM, verrà generata un'eccezione irreversibile se si tenta di richiamare l'oggetto Imagick, quindi è necessario chiamare getimageblob();

$imagick = new Imagick('my-image.jpg'); 
header('Content-Type: image/' . $imagick->getImageFormat()); 
echo $imagick->getimageblob();