php imagick将PNG转换为jpg

问题描述:

$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没有很好的记录,所以我不知道如何帮助自己)。

找到了解决办法:

$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

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

+0

'PHP致命错误:未捕获异常'ImagickException'带有消息'无效的参数提供'',使用'#ffffff'代替不会导致失败,但也没有帮助。 'setImageBackgroundColor'不起作用 – rabudde

您可以使用setBackgroundColor设置默认背景色为黑色别的东西。保存为JPG时,PNG透明度将被替换为背景颜色。

编辑:使用它像这样:

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

看到上面的评论,这并没有解决它:( – rabudde

+0

你需要传递一个ImagickPixel对象,而不是一个颜色字符串,如果你有Imagick

+0

我'在调用'new Imagick()'后,我添加了'setBackgroundColor'但是这看起来没有任何作用,我使用PHP 5.3.6,ImageMagick 6.7.0,Imagick 3.1.0。 – rabudde

另一种方法是透明的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感谢这篇文章 –