У меня есть png-изображение с прозрачным фоном, и я хочу преобразовать его в jpg-изображение с белым фоном.
Код в основном таков:
$image = new Imagick('transparent.png'); $image->writeImage('opaque.jpg');
Но это создает черный фон jpg. Я боролся с худшей документацией, когда-либо пытавшейся найти способ преобразования прозрачного в белый безрезультатно.
Редактирование : Хорошо, я попробовал идею Марка Б и получил работу.
$image = new Imagick('transparent.png'); $white = new Imagick(); $white->newImage($image->getImageWidth(), $image->getImageHeight(), "white"); $white->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0); $white->writeImage('opaque.jpg'); $image->destroy(); $white->destroy();
Проблема в том, что она всегда вызывает сценарий segfault.
flattenImages()
фактически работает.
Но имейте в виду, что он не изменяет данный объект \Imagick()
а возвращает новый :
$image = new \Imagick('transparent.png'); // Need to use the result of $image->flattenImages() here! $image = $image->flattenImages(); $image->writeImage('opaque.jpg');
flattenImages()
умолчанию – white
цвет фона. Если вы хотите использовать другой цвет фона, вы должны установить его перед загрузкой изображения:
$image = new \Imagick(); // Needs to be called before the image is loaded! $image->setbackgroundcolor('green'); $image->readimage('transparent.png'); $image = $image->flattenImages(); $image->writeImage('opaque.jpg');
В общем, API Imagick очень разумен, когда речь идет о порядке вызовов функций (так же, как convert
и его параметры в командной строке), поэтому всегда проверяйте правильность вашего заказа.
Удачи!
Редактировать Апрель 2016:
$image->flattenImages()
устарел и должен быть заменен на:
$image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN)
Трудно найти точную информацию об этом, но, похоже, это относится к PHP> = 5.6.
Благодаря vee для подсказки!
Я столкнулся с той же проблемой при преобразовании PDF-файлов в PNG, и я использовал flattenImages ().
//get the first page of the PDF $im = new imagick( $file.'[0]' ); //set the background to white $im->setImageBackgroundColor('white'); //flatten the image $im = $im->flattenImages(); //do the rest of the image operations $im->setResolution( 181, 181 ); $im->setCompressionQuality(100); $im->resizeImage ( 181, 181, imagick::FILTER_LANCZOS, 1, TRUE); $im->setImageFormat('png'); $imageName = $title.'_thumb.png';
Пытаться:
$image = new Imagick('transparent.png'); $image->setImageMatte(true); $image->setImageMatteColor('white'); $image->setImageAlphaChannel(Imagick::ALPHACHANNEL_OPAQUE); $image->writeImage('opaque.jpg');
$image = new Imagick('transparent.pdf'); $image->setImageType (imagick::IMGTYPE_TRUECOLOR); $image->writeImage('opaque.tif');
сделал для меня!
(вместо прежнего imagick :: IMGTYPE_TRUECOLORMATTE)
Попробуй это:
$white->newImage($image->getImageWidth(), $image->getImageHeight(), "transparent");
Вы можете попробовать это, изменив константу Imagick, как показано ниже.
//$image will conatains image which needs background to be transparent $white = new Imagick(); $white->newImage($image->getImageWidth(), $image->getImageHeight(), new ImagickPixel( "white" )); $white->compositeimage($image, Imagick::COMPOSITE_DEFAULT, $x1OfTransparentImage, $y1OfTransparentImage,); $white->flattenImages(); $white->writeImage('opaque.jpg'); $white->destroy();
Попробуйте следующее, это работает для меня:
$im = new Imagick('trans.png'); $im->setimagebackgroundcolor('white'); $im = $im->flattenimages(); $im->writeimage('transToWhite.jpg');
Надеюсь, это поможет!
Что касается вопроса с segfault, я столкнулся с той же проблемой.
Очевидно, $image->writeImage('somename')
уничтожает $image
или ссылку на него.
Я столкнулся с тем же вопросом. То, как я обошел это, было удаление вызова, чтобы уничтожить объект, который я закончил писать. Кажется неаккуратным, но это решило проблему с segfault
Проблема Segfault: у меня была аналогичная проблема (сценарий продолжал давать мне segfault, даже когда изображение было должным образом обработано и написано), решение, которое я нашел, появилось после проверки отчетов об ошибках, см. https://bugs.php.net/bug. PHP? ID = 61122
Зная это, попробуйте добавить
$white->setResourceLimit(6, 1); // 6 means "limit threads to"
перед проблематичной линией (в моем случае я должен был поставить ее перед $ im-> resizeImage (…);)