ImageMagick - setImageAlphaChannel не работает (php)

Итак, у меня есть эта IM-команда ($ plistnew - список коордов, как вы ожидали бы для многоугольника):

convert in.png ( -size 101x101 xc:black -fill white \
    -draw "polygon $plistnew" -alpha off \
    -crop 101x100+0+1 +repage \
    -scale 101x1! ) \
    -clut out.png

Поэтому мне нужно преобразовать это в чистый PHP. Я был довольно успешным, за исключением одной оставшейся проблемы с setImageAlphaChannel().

Во всяком случае, это мой PHP:

$tmpa = new Imagick(); // for the image I'm assuming is generated inside the parens
$tmpa->newPseudoImage(101, 101, 'canvas:black'); // xc:black

$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white')); // -fill white
$draw->polygon($points); // -draw "polygon $plistnew"

$tmpa->drawImage($draw);
$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE); // -alpha off
$tmpa->cropImage(101, 100, 0, 1); // -crop 101x100+0+1

// +repage
$tmpa->resetImagePage('');

$tmpa->scaleImage(101, 1); // -scale 101x1! -- I think scaleImage() ignores ratio per the ! by default ... I'm not positive though.

$im = new Imagick('in.png');
$im->clutImage($tmpa); // -clut
$im->writeImage('out.png');
$tmpa->destroy();

Переменная $points - это массив, сформированный правильно для использования с ImagickDraw:: polygon().

Эта строка:

$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE);

flat out не работает. Он вызывает эту ошибку:

PHP Fatal error:  Uncaught exception 'ImagickException' with message 'Unable to set image alpha channel'

Когда я прокомментирую эту строку, все, похоже, работает нормально. Как предотвратить эту ошибку?

Ответ 1

У меня также были проблемы с удалением альфа-канала PNG и GIF, поэтому я попробовал пару вещей, но в итоге использовал это:

// Image has transparency
if ($image->getImageAlphaChannel()) {

    // Remove alpha channel
    $image->setImageAlphaChannel(11);

    // Set image background color
    $image->setImageBackgroundColor('white');

    // Merge layers
    $image->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);
}

Я пошел с использованием "11", потому что imagick:: ALPHACHANNEL_REMOVE не работал с моей версией. Для справки о imagick:: ALPHACHANNEL_REMOVE см. Этот комментарий: http://php.net/manual/en/imagick.flattenimages.php#116665

Ответ 2

Per руководство для setImageAlphaChannel

Этот метод доступен, если Imagick был скомпилирован против ImageMagick версии 6.3.8 или новее.

Вам, скорее всего, придется строить расширение Imagick против соответствующей версии imagemagick самостоятельно. Конечно, вы можете google для шагов, но вот пример того, что я сделал на Ubuntu, YMMV

Установить imagemagick из источника

apt-get install build-essential libpng12-dev libglib2.0-dev libfontconfig1-dev zlib1g-dev libtiff4-dev libexif-dev libfreetype6-dev

mkdir sources
cd sources
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz

new_dir=$(ls -1 | grep ImageMagick-)
cd $new_dir
./configure --prefix=/usr --without-lzma --without-jng --without-jbig --without-mpeg --without-ps
make
make install

Установить pecl

sudo apt-get install php5-dev php-pear

Установите php imagick из источника

sudo pecl config-set preferred_state beta
sudo apt-get remove --purge php5-imagick
sudo pecl install imagick
sudo bash -c 'echo extension=/usr/lib/php5/20121212/imagick.so > /etc/php5/mods-available/imagick.ini'
sudo php5enmod imagick

Убедитесь, что php imagick установлен и setImageAlphaChannel доступен

php --rc Imagick | grep -i setImageAlphaChannel

Если grep находит совпадение, установка прошла успешно.

Ответ 3

Я не тестировал это, но если ваша конечная цель - создать непрозрачное изображение без поддержки альфа-канала, возможно, попробуйте установить Imagick:: setFormat для png24.

$tmpa->setFormat('png24');

Это заставит объект Imagick использовать непрозрачный 24-битный формат PNG, а не непрозрачный или прозрачный 32-битный PNG-формат. Возможно, вам придется установить цвет фона или что-то в этом роде, чтобы гарантировать, что любые альфа-объекты, добавленные в изображение, будут обработаны соответствующим образом.