2011-07-07 162 views
9
$image = "[...]"; //binary string containing PNG image 
$file = fopen('image.tmp', 'wb'); 
fputs($file, $image); 
fclose($file); 
$image = new Imagick('PNG:image.tmp'); 
$image->thumbnailImage($width, $height); 
$image->setImageFormat('jpg'); 
$image->setCompressionQuality(97); 
$image->writeImage('image.jpg'); 

以上不起作用,並給我一個this圖像的黑色圖像。代替時php imagick將PNG轉換爲jpg

[...] 
$image->setImageFormat('png'); 
$image->setCompressionQuality(97); 
$image->writeImage('image.png'); 

一切都很好。我認爲它必須做一些透明的背景,這是不可用的JPG格式。任何人都可以幫助解決這個問題(imagick沒有很好的記錄,所以我不知道如何幫助自己)。

回答

15

找到了解決辦法:

$white=new Imagick(); 
$white->newImage($width, $height, "white"); 
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0); 
$white->setImageFormat('jpg'); 
$white->writeImage('image.jpg'); 
+2

這在處理PDF時也非常有用,因爲'flattenImages'方法將頁面重置爲最後一個... Thanks @rabudde! – Roberto

0

嘗試增加$image->setBackgroundColor(0xFFFFFF);$image = new Imagick('PNG:image.tmp');

+0

'PHP致命錯誤:未捕獲異常'ImagickException'帶有消息'無效的參數提供'',使用'#ffffff'代替不會導致失敗,但也沒有幫助。 'setImageBackgroundColor'不起作用 – rabudde

2

您可以使用setBackgroundColor設置默認背景色爲黑色別的東西。保存爲JPG時,PNG透明度將被替換爲背景顏色。

編輯:使用它像這樣:

$img->setBackgroundColor(new ImagickPixel('#FFFFFF')); 
+0

看到上面的評論,這並沒有解決它:( – rabudde

+0

你需要傳遞一個ImagickPixel對象,而不是一個顏色字符串,如果你有Imagick <= 2.1。請參閱我編輯的響應 –

+0

我'在調用'new Imagick()'後,我添加了'setBackgroundColor'但是這看起來沒有任何作用,我使用PHP 5.3.6,ImageMagick 6.7.0,Imagick 3.1.0。 – rabudde

5

另一種方法是透明的PNG轉換爲JPG格式,如Imagick::flattenImages提到:

$im = new Imagick('image.png'); 
$im->setImageBackgroundColor('white'); 

$im->flattenImages(); // This does not do anything. 
$im = $im->flattenImages(); // Use this instead. 

$im->setImageFormat('jpg'); 
$im->writeImage('image.jpg'); 
+0

非常感謝,它解決了我的問題:) – kailash19

+0

Many感謝這篇文章 –