Intereting Posts
stream_socket_client не удалось подключиться (время ожидания подключения) htacces переписать правило конфликта с другим URL-адресом Session недоступен и не входит в число последних 1000 завершенных сеансов. Как это решить? принудительная загрузка файла с помощью php как установить непрозрачность непрозрачности изображения во время загрузки? Зачем использовать фреймворк с PHP? Как перезаписать класс из компонента безопасности? PHP: Как превратить массив в объект StdClass? Установка PDO_MYSQL на PHP 5.1.6 с использованием ОС PECL: UBUNTU У меня есть класс с 14 статическими методами и 4 статическими свойствами – это плохо? Хранение вложенных массивов в файле cookie HEREDOC вмешивается в отступы кода Вызовите частные методы и частные свойства извне класса в PHP Отправка файлов cookie, хранящихся на глобальном уровне $ _COOKIE, с использованием PHP curl Страница обслуживания ZF2

Прозрачный до белого в Imagick для PHP

У меня есть 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.

Related of "Прозрачный до белого в Imagick для PHP"

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 (…);)