2011-02-08 14 views
14

Używam Imagick lib, aby wykonać pewne modyfikacje oryginalnego obrazu. Następnie chciałbym wyprowadzić go bezpośrednio do przeglądarki bez zapisywania. Czy jest jakiś sposób na zrobienie tego?Wyodrębnij surowy obraz z obrazu Imagick w PHP

Próbowałem użyć Imagick::writeImage('STDOUT') (puste wyjście) i "php: // stdout" z błędem "Nie można zapisać do pliku".

Wszelkie pomysły? :)

Odpowiedz

23

Trzeba tylko echo swój obiekt Imagick:

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

Jak pokazano w przykładzie nr 1: http://es2.php.net/manual/en/imagick.examples-1.php –

+6

Poszedłbym z 'nagłówkiem ('Content-Type: image /'.$ img- > getImageFormat()); '- ale poza tym bardzo ładne :) – gnud

+0

Tak, to lepiej :) – Nabab

-1

Czy próbowałeś Imagick::writeImageFile("php://stdout") (niesprawdzone)?

+0

To byłoby 'writeImage()', a to nie działa! – Benjamin

2

wierzę co Schneck oznaczało to:

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

Ten może powodować problemy, zwłaszcza w plikach wielostronicowych, więc prawdopodobnie powinny użyj:

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; 

To jest testowane i działa ing.

Zdaję sobie sprawę, że to stare pytanie. Powodem, dla którego to publikuję, jest to, że jeśli chcesz napisać wielostronicowy plik PDF, jest to rozwiązanie, ponieważ rozwiązanie Nababa działa tylko w przypadku pojedynczych obrazów.

Można również użyć (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; 

ten sposób wydaje się być szybciej, jeśli twoja wersja PHP obsługuje.

Przed downvote, powodem dodałem to jako odpowiedź, a nie komentarz, to nie mam wystarczającej reputacji uwag. Mam nadzieję, że jest w porządku. Po prostu chciałem to wydać na wypadek, gdyby ktoś go potrzebował.

1

Jeśli używasz HHVM będzie ona rzucać wyjątek krytyczny, jeśli tylko spróbować i echo obiektu Imagick więc trzeba zadzwonić getimageblob();

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