Php imagick прозрачный фон

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

У меня есть png-изображение с прозрачным фоном, и я хочу преобразовать его в jpg-изображение на белом фоне.

$image = new Imagick('transparent.png'); $image->writeImage('opaque.jpg'); 

Но это создает черный фон jpg. Я боролся с худшей документацией, когда-либо пытавшейся найти способ преобразования прозрачного в белый безрезультатно.

Edit:
Ну, я попробовал идею Марка Б, и я получил ее для работы.

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

Теперь проблема заключается в том, что она всегда вызывает script 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 и его параметров в командной строке), поэтому всегда проверяйте правильность вашего заказа.

$image->flattenImages() устарел и должен быть заменен на:

$image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN) 

Трудно найти точную информацию об этом, но, похоже, это относится к PHP >= 5.6.

Я столкнулся с той же проблемой при преобразовании 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:
У меня была аналогичная проблема (script продолжал давать мне segfault, даже когда изображение было правильно обработано и записано), решение, которое я нашел, появилось после проверки отчетов об ошибках, см.
https://bugs.php.net/bug.php?id=61122

Зная это, попробуйте добавить $white->setResourceLimit(6, 1); // 6 means «limit threads to»
перед проблематичной линией (в моем случае я должен был поставить ее перед $im- > resizeImage (…);)

У меня была ситуация, когда я пытался заменить прозрачный фон белым (но держать как png). Пробовал несколько разных методов (включая setImageAlphaChannel с setImageBackgroundColor). Объединив использование OP в compImage, я придумал это (надеюсь, полезно кому-то другому):

$pic = new Imagick($filelocation); //specify file name $pic->setResourceLimit(6, 1); if ($pic->getImageAlphaChannel()) < $white = new Imagick(); $white->newImage($pic->getImageWidth(), $pic->getImageHeight(), "white"); $white->compositeImage($pic, Imagick::COMPOSITE_OVER, 0, 0); $pic = clone $white; $white->destroy(); $pic->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN); > //do more things with $pic 

Источник

Как заменить однородный фон прозрачным с помощью Imagemagick

Бывает, что на сайт загружаются картинки с однородным фоном и возникает потребность в автоматической замене его (фона) на прозрачный.

image

Часто такая фича нужна для фотографий товаров в интернет-магазине, картинок, которые накладываются на корпоративный фон и других фоток, не портящих дизайн сайта. Вырезать каждую фотку вручную фотошопом довольно грустно, но есть php-методы, с помощью которых это можно «поставить на поток».

Как это работает

Функция попиксельно ищет где заканчивается однородный цвет. После того, как все координаты вычислены — функция просто вырезает все, что находится снаружи.

Замена белого фона прозрачным возможна только если выходная картинка сохранена в формате PNG или GIF. Подойдут и новые форматы WebP и BPG с поддержкой прозрачности.

image

Перед удалением фона всегда лучше ресайзить большую картинку. Если сделать это после — границы могут исказиться.

Замена фона, пример на bash

Для удаления фона в ImageMagick есть оператор -trim. Он обрезает картинку по заданному цвету:

convert image.jpg -quality 100 image.png convert image.png -fuzz 20% -fill white -draw "color 5,5 floodfill" -quality 100 image.png convert image.png -transparent white image.png convert image.png -define convolve:scale="100!,100%" -morphology Convolve "Log:0x2" image.png 

Перед обрезкой стандартный JPEG конвертируется в PNG. В lossy JPEG’е фон не будет однородным. Соседние пиксели обычно незначительно отличаются по цвету. Например: белый, светло-серый, светло-голубой. Аргумент fuzz устанавливается в значение >0, чтобы разрешить функции считать соседние цвета одинаковыми.

Замена фона, пример на PHP

Пример обрезки белого фона на картинке (входной файл: image.jpg, выходной — trimmed.png):

setImageFormat('png'); > $image->borderImage('#ffffff',1, 1); $image->trimImage(0); $image->setImagePage(0, 0, 0, 0); $image->writeImage('trimmed.png'); ?> 

Оператор borderImage рисует вокруг картинки рамку 1х1 в цвет фона, после чего оператор trimImage обрезает ее вместе с рамкой.

image

Внимание! Оператор trimImage работает, если Imagick скомпилирован с ImageMagick версии не ниже 6.2.9.

Как сделать фон однородным

Похожим способом можно заменить неоднородный фон на однородный при конвертации из JPEG в PNG:

convert image.jpg -fill none -fuzz 1% -draw 'matte 0,0 floodfill' -flop -draw 'matte 0,0 floodfill' -flop image.png 

В этом примере — каждый пиксель фона зальется одним цветом — пикселя с координатами (0;0).

image

Много примеров работы кода

Как работает обрезка фона с помощью библиотеки Imagick можно проверить тут. Онлайн-инструмент заменяет любой однородный фон на прозрачный, как с этим яблочком. Вот пример с черным фоном и сложными формами для трима (волосы). Конечно, может оставаться небольшая белая рамка. Но выглядит довольно прилично. Даже кошачьи усы вырезает на ура.

Конспект

  1. Для удаления однотонного фона с картинки можно использовать оператор
    -trim или команду trimImage.
  2. Проверить как работает удаление фона с помощью Imagick можно тут.
  3. Выходную картинку нужно сохранить в любом из форматов с поддержкой прозрачности: PNG, GIF, WebP, BPG.

Источник

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

У меня есть png-изображение с прозрачным фоном, и я хочу преобразовать его в jpg-изображение на белом фоне. В основном это код:

$image = new Imagick('transparent.png'); $image->writeImage('opaque.jpg'); 

Но это создает черный фон jpg. Я боролся с худшей документацией, когда-либо пытавшейся найти способ преобразования прозрачного в белый безрезультатно. Edit: Ну, я попробовал идею Марка Б, и я получил ее для работы.

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

Попробуйте выполнить вызов destroy() в обратном порядке; сначала $white , затем $image . $white может зависать от указателя на $image из-за композиции, а затем пытаться ссылаться на него во время destroy() и segfaulting, потому что он исчез.

Да, API-интерфейсы для ImageMagick вроде бы такие. Мне известно, что я отказался от нативного кода и просто написал вызовы system() для convert в командной строке.

10 ответов

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 и его параметров в командной строке), поэтому всегда проверяйте правильность вашего заказа.

$image->flattenImages() устарел и должен быть заменен на:

$image->mergeImageLayers(\Imagick::LAYERMETHOD_FLATTEN) 

Трудно найти точную информацию об этом, но, похоже, это относится к PHP >= 5.6.

Источник

ImageMagick Прозрачный фон PNG

Изображение 25869

Я пытаюсь взять это изображение , которое я преобразовал в файл .png, а затем хочу удалить белый фон, чтобы сделать его прозрачным. Я попробовал запустить следующее, но не имел никакой удачи.

 $strInputFile = 'car.png'; $execScript = '/usr/local/bin/convert '.$strInputFile.' '; $execScript .= "-transparent white car-new.png"; $output = shell_exec($execScript); 

6 ответов

Аналогичная проблема с php imagick: При преобразовании SVG в прозрачный PNG не забудьте поставить это перед $imagick- > readImageBlob():

$imagick->setBackgroundColor(new ImagickPixel('transparent')); 

У меня была та же проблема, и вышеупомянутое предложение помогло мне продвинуться немного дальше. Однако теперь сгенерированный файл png имеет черный фон. 🙁

Поэтому после долгих проб и ошибок я понял, что использую $ im-> adaptiveSharpenImage (2,1); в моем PHP-код после метода setbackgroundColor, и это, казалось, создать непрозрачный фон. После удаления этого метода я мог получить png прозрачный фон. Теперь, чтобы понять, как получить четкие, четкие и полные png изображения из svg. 🙂 Еще раз спасибо за ответ.

Поскольку изображение является JPEG, которое подвержено потерям и небольшим неточностям цвета, белые в вашем изображении на самом деле не 100% чисто белые. ImageMagick имеет способ справиться с этим с помощью параметра -fuzz , который позволяет определить степень нечеткости или диапазон допустимых ошибок при указании цветов.

Правильное заклинание здесь:

convert car.jpg -fuzz 10% -transparent white car.png 

С помощью нескольких попыток я получил идеальный результат: convert source.png -fuzz 4% -transparent white result.png . 10% съели слишком много пикселей.

Попробуйте использовать следующий код:

$strInputFile = 'car.png'; $target = 'car_transparent.png'; $im = new Imagick($strInputFile); $im->paintTransparentImage($im->getImageBackgroundColor(), 0, 10000); $im->setImageFormat('png'); $im->writeImage($target); $im->destroy(); 

Источник

Читайте также:  Oracle how to install java
Оцените статью