2011-02-08 66 views
14

我正在使用Imagick lib對原始圖像進行一些修改。然後我想直接輸出到瀏覽器而不保存。有沒有辦法做到這一點?從PHP的Imagick圖像輸出原始圖像

我試圖使用Imagick::writeImage('STDOUT')(空輸出)和'php:// stdout',錯誤爲「無法寫入文件」。

任何想法? :)

回答

23

你只需要回聲您imagick對象:

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

如示例1所示:http://es2.php.net/manual/en/imagick.examples-1.php – 2011-02-08 11:13:49

-1

你試過Imagick::writeImageFile("php://stdout")(未經測試)?

+0

這將是`writeImage()`,這是行不通的! – Benjamin 2012-08-19 22:54:26

2

我相信施內克的意思是:

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

可能產生問題,尤其是在多頁文件,所以你或許應該使用:

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; 

這是測試和工作ING。

我意識到這是一個老問題。我發佈這個的原因是,如果你想寫一個多頁PDF,這是解決方案,因爲Nabab的解決方案只適用於單個圖像。

您也可以使用(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; 

這種方式似乎是更快,如果你的PHP版本支持。

在你downvote之前,我把這個作爲答案而不是評論的原因是我沒有足夠的評論聲望。希望這是可以的。只是想在這種情況下得到這個以防萬一需要它。

1

如果你使用HHVM,它會拋出一個致命的異常,如果你只是嘗試回聲Imagick對象,所以你需要調用getimageblob();

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