Преобразование PNG в JPG и установка белого прозрачного фона с помощью ImageMagick и PHP

Как я могу использовать ImageMagick (с расширением php), чтобы установить белый фон для прозрачного фона при преобразовании изображения из PNG в JPEG?


person John    schedule 12.03.2011    source источник
comment
Каких расширений php их три. MagickWand, IMagick или phMagick?   -  person Orbling    schedule 12.03.2011


Ответы (2)


На момент написания вы не указали, какое расширение вы используете, но если бы вы использовали командную строку, команда была бы такой:

convert image.png -background white -flatten -alpha off image.jpg

Дополнительную информацию можно найти в документации по использованию маскирования.

Например, используя IMagick, я думаю, вы могли бы сделать это следующим образом:

(полностью не тестировалось, никогда не использовал IMagick и не устанавливал его для тестирования)

$image = new IMagick('image.png');

$flattened = new IMagick();
$flattened->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel("white"));

$flattened->compositeImage($image, imagick::COMPOSITE_OVER, 0, 0);

$flattened->setImageFormat("jpg");
$flattened->writeImage('image.jpg');

$image->clear();
$image->destroy();
$flattened->clear();
$flattened->destroy();
person Orbling    schedule 12.03.2011
comment
Я считаю, что вам следует использовать $sizes = $image->getImageGeometry(); $width = $sizes['width']; $height = $sizes['height']; вместо $image->getWidth(), $image->getHeight() - person CappY; 13.03.2011
comment
@CappY: Это тоже работает, есть ли причина для этой функции по сравнению с двумя другими, кроме, возможно, повышения производительности на несколько микросекунд? - person Orbling; 13.03.2011
comment
@Orbling: Fatal error: Call to undefined method Imagick::getWidth() Не знаю, работает ли это для вас. - person CappY; 13.03.2011
comment
@CappY: Как странно ... это в документе: php.net /manual/en/function.imagick-getimagewidth.php - person Orbling; 13.03.2011
comment
Это $image->getImageWidth(); и $image->getImageHeight(); Я этих функций не видел. :) - person CappY; 13.03.2011
comment
@Orbling, Вы используете два шага для преобразования формата. Сначала вы устанавливаете новый формат (jpg), затем writeImage('image.jpg'). Я обнаружил, что устанавливать формат не обязательно. Достаточно просто записать желаемое расширение изображения при сохранении изображения - writeImage('image.jpg') или writeImage('image.gif'). Он автоматически конвертирует формат. Когда вы проверяете сохраненные изображения в консоли с помощью identify -verbose, они имеют совершенно новые форматы. Но никаких официальных документов об этом поведении нет. Следует ли мне сначала использовать setImageFormat() или в этом нет необходимости? - person Green; 22.08.2012
comment
@Green: сама Image Magick, или, скорее, версия командной строки ведет себя так, как вы говорите, поэтому я ожидаю, что команда writeImage() будет работать так же, как вы проверили. Как я сказал выше, код не тестировался мною, просто был написан в браузере - так как команда для изменения формата существовала, я использовал ее на всякий случай. Осмелюсь сказать, что он позволяет использовать нестандартные расширения или вывод в браузер. Было бы неплохо оставить его, если это не требует дополнительного времени, если это так, я бы удалил его и разрешил автоматическое преобразование. - person Orbling; 23.08.2012

Если вы используете расширение Imagick:

<?php
// load the source transparent png
$i = new IMagick('image.png');

// set the background to white
// you can also use 'rgb(255,255,255)' in place of 'white'
$i->setImageBackgroundColor(new ImagickPixel('white'));

// flattens multiple layers
$i = $i->flattenImages();

// the output format
$i->setImageFormat('jpg');

// save to disk
$i->writeImage('image.jpg');

// and/or output directly
// header('Content-Type: '.$i->getFormat());
// echo $i->getImageBlob();

// cleanup
$i->clear();
$i->destroy();
person Mike Causer    schedule 31.10.2012
comment
Старый ответ, но flattenImages теперь устарел, и рекомендуемый способ - mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) php.net/manual/en/imagick.mergeimagelayers.php - person tbleckert; 10.03.2016