Imagick потерял прозрачность при использовании setImageOpacity и composeImage

Я хочу объединить изображение в другое с прозрачностью. Поэтому я использую Imagick с PHP.

Вот что я получаю:
воображаемый результат

Это то, что я хочу:
ожидаемый результат

У кого-нибудь есть ответ, почему прозрачность $ imageTransparent теряется после использования setImageOpacity ()?

Вот мой код:

$image = new \Imagick();
$imageTransparent = new \Imagick();

$background = new \ImagickPixel('rgba(0,0,255,1)');
$image->newImage(600, 400, $background);

$background = new \ImagickPixel('rgba(255,255,255,0)');
$imageTransparent->newImage(600, 400, $background);

$draw = new \ImagickDraw();
$draw->setFillColor('#ff0000');
$draw->polygon(array(
array('x' => 50, 'y' => 50),
array('x' => 400, 'y' => 50),
array('x' => 50, 'y' => 300),
));

$imageTransparent->drawImage($draw);
$imageTransparent->setImageOpacity(0.5);

$image->compositeImage($imageTransparent, \Imagick::COMPOSITE_DEFAULT, 0, 0);

РЕДАКТИРОВАТЬ: я не хочу устанавливать прозрачность в DrawObject! $ imageTransparency может быть чем угодно. например PNG с прозрачным фоном.

Я хочу растворить http://www.imagemagick.org/Usage/compose/#dissolve

1

Решение

В командной строке Imagemagick, если вы хотите уменьшить прозрачность изображения на 50%, вы должны выбрать альфа-канал и умножить его на 0,5, а затем снова включить все каналы.

Вот прозрачный логотип Imagemagick (с прозрачным белым фоном).

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

convert \
\( -size 600x400 xc:blue \) \
\( logot.png -channel a -evaluate multiply 0.5 +channel \) \
-composite test2.png

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

По сравнению с не изменением альфа-канала и просто компостированием, как

convert \
\( -size 600x400 xc:blue \) \
\( logot.png \) \
-composite test1.png

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

Извините, я не знаю эквивалентных команд в Imagick. Но посмотри на Imagick

1

Другие решения

Я не очень хорошо знаю Imagick, но попробуйте использовать непрозрачный синий фон на прозрачном изображении, а затем нарисуйте на нем полупрозрачный красный треугольник. (Вы устанавливали все выходное изображение на половину прозрачности и использовали прозрачный белый фон на меньшем изображении). Обратите внимание, я удалил вашу линию $imageTransparent->setImageOpacity(0.5);

$image = new \Imagick();
$imageTransparent = new \Imagick();

$background = new \ImagickPixel('rgba(0,0,255,1)');
$image->newImage(600, 400, $background);

$background = new \ImagickPixel('rgba(0,0,255,1)');
$imageTransparent->newImage(600, 400, $background);

$draw = new \ImagickDraw();
$draw->setFillColor('rgba(255,0,0,0.5)');
$draw->polygon(array(
array('x' => 50, 'y' => 50),
array('x' => 400, 'y' => 50),
array('x' => 50, 'y' => 300),
));

$imageTransparent->drawImage($draw);

$image->compositeImage($imageTransparent, \Imagick::COMPOSITE_DEFAULT, 0, 0);

Вышеуказанное должно быть эквивалентно следующей командной строке Imagemagick:

convert \
\( -size 600x400 xc:blue \) \
\( -size 600x400 xc:blue -fill "rgba(255,0,0,0.5)" \
-draw "polygon 50,50 400,50 50,300" \) \
-composite test.png

Который дает следующий результат:

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

0

По вопросам рекламы [email protected]