PHP, удаляющий альфа-канал в Imagick, приводит к повреждению изображения

У меня есть URL-адрес с изображением. Сохраняю изображение внутри переменной. Если я загружаю переменную с помощью Imagick, изображение после удаления альфа-канала повреждено.

код:

$image = new Imagick();
$image->readImageBlob($picture);
$image->writeImage ("test.png");

введите описание изображения здесь

код:

$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(11);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("test.png");

введите описание изображения здесь

Версия PHP 7.3.11

версия модуля imagick: 3.4.4RC2

Imagick скомпилирован с помощью ImageMagick версия: ImageMagick 7.0.7-11 Q16 x64 2017-11-23

Дата выпуска ImageMagick: 23.11.2017

Изображение не работает сразу после "setImageAlphaChannel". Является ли исходный файл причиной проблемы? Если да, есть ли способ восстановить битый образ?

Заранее спасибо!

Редактировать:

Вот мой полный код:

<?php


$url="https://i.imgur.com/jD5hRgO.png";

$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); 
curl_setopt ($ch, CURLOPT_TIMEOUT, 60); 
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt ($ch, CURLOPT_REFERER, $url); 
$picture = curl_exec ($ch); 
curl_close($ch);

$image = new Imagick();
$image->readImageBlob($picture);
$image->writeImage ("before.png");


$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(11);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("after.png");


?>

person Vidarrus    schedule 18.11.2019    source источник
comment
Ссылка на изображение: i.imgur.com/jD5hRgO.png   -  person Vidarrus    schedule 19.11.2019
comment
Вы используете значение 11 для установки альфа-канала, который соответствует OpaqueAlphaChannel. Вы должны использовать предопределенную константу Imagick::ALPHACHANNEL_REMOVE, которая заменит альфа-канал на цвет фона.   -  person emcconville    schedule 19.11.2019
comment
Это решило мою проблему! Если вы опубликуете его как ответ, я отмечу его как правильный. Спасибо за вашу помощь!   -  person Vidarrus    schedule 19.11.2019


Ответы (1)


Вы хотите использовать Imagick::ALPHACHANNEL_REMOVE.

$image = new Imagick();
$image->readImageBlob($picture);
$image->setImageBackgroundColor('white');
$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
$image->writeImage ("after.png");

Это заменит прозрачные пиксели цветом фона.

Изображение не работает сразу после "setImageAlphaChannel". Является ли исходный файл причиной проблемы?

На самом деле не сломано, но проблема вызвана исходным файлом. Установка альфа-канала на 11 (т.е. OpaqueAlphaChannel в C-API) заставит "скрытые" значения цвета быть непрозрачными. В вашем примере невидимые данные RGB были артефактами, оставшимися от автора, создавшего изображение.

Если да, есть ли способ восстановить битый образ?

Неа! Вам нужно переделать битые файлы из исходников. Применение -alpha opaque разрушительно для альфа-маски.

Цитата из статьи об использовании "Маски" ...

Исходная «форма» изображения больше не может быть восстановлена ​​после этой операции, так как исходные данные альфа-канала были перезаписаны.

person emcconville    schedule 19.11.2019