Я хочу объединить изображение в другое с прозрачностью. Поэтому я использую 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
В командной строке 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
Я не очень хорошо знаю 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
Который дает следующий результат: