Reputation: 7722
$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).
Upvotes: 14
Views: 37362
Reputation: 119
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);
Upvotes: 11
Reputation: 7722
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');
Upvotes: 26
Reputation: 23216
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'));
Upvotes: 2
Reputation: 9122
Try adding $image->setBackgroundColor(0xFFFFFF);
after $image = new Imagick('PNG:image.tmp');
Upvotes: 0