Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php imagick convert PNG to 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');

The above doesn't work and gives me a black image for this image. When doing instead

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

all is fine again. I think it has to do something with transparent background, which isn't available in JPG format. Can anyone help to solve this (imagick isn't documented very well, so I don't know how to help myself).

like image 780
rabudde Avatar asked Jul 07 '11 12:07

rabudde


3 Answers

Another way to convert transparent png to jpg, as mentioned in 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');

As time moves on, flattenImages() has been deprecated.
Instead of the line above use:

$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
like image 168
Bastien Avatar answered Oct 25 '22 00:10

Bastien


Found a solution:

$white=new Imagick();
$white->newImage($width, $height, "white");
$white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$white->setImageFormat('jpg');
$white->writeImage('image.jpg');
like image 26
rabudde Avatar answered Oct 25 '22 02:10

rabudde


You can use setBackgroundColor to set the default background color to something else than black. The PNG transparency will be replaced by the background color when saving to JPG.

Edit: Use it like so:

$img->setBackgroundColor(new ImagickPixel('#FFFFFF'));
like image 2
Sander Marechal Avatar answered Oct 25 '22 02:10

Sander Marechal