PHP Imagick конвертировать PNG в JPG - PullRequest
10 голосов
/ 07 июля 2011
$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');

Выше не работает и дает мне черное изображение для этого изображения. Делая вместо

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

все снова хорошо. Я думаю, что это связано с прозрачным фоном, который недоступен в формате JPG. Может ли кто-нибудь помочь решить эту проблему (imagick не очень хорошо задокументирован, поэтому я не знаю, как помочь себе).

Ответы [ 4 ]

17 голосов
/ 08 июля 2011

Нашел решение:

$white=new Imagick();
$white->newImage($width, $height, "white");
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$white->setImageFormat('jpg');
$white->writeImage('image.jpg');
9 голосов
/ 07 сентября 2012

Другой способ конвертировать прозрачный 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');

Со временем, flattenImages() устарело.
Вместо строки выше используйте:

$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
2 голосов
/ 07 июля 2011

Вы можете использовать setBackgroundColor, чтобы установить цвет фона по умолчанию, отличный от черного.Прозрачность PNG будет заменена цветом фона при сохранении в JPG.

Редактировать : используйте его так:

$img->setBackgroundColor(new ImagickPixel('#FFFFFF'));
0 голосов
/ 07 июля 2011

Попробуйте добавить $image->setBackgroundColor(0xFFFFFF); после $image = new Imagick('PNG:image.tmp');

...