Применить маску градиента к изображению, которое уже имеет прозрачность с помощью ImageMagick?

У меня есть PNG-изображение с прозрачностью:

original.png
 Оригинал

Теперь я хочу использовать ImageMagick, чтобы применить диагональный градиент к его альфа-каналу. Я имею в виду, что его непрозрачность остается в верхнем левом углу и постепенно исчезает до полностью прозрачной в правом нижнем углу. Нравится:

result.png
 Результат

По сути, я хочу создать градиент и использовать его как маску для изображения. Но у изображения уже есть собственный альфа-канал (прозрачность). Вот визуализация того, что я пытаюсь:

Операция

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

Думаю, я понимаю, как создать диагональный градиент (команда барицентрического градиента очень полезно для этого). Но это создает градиент в цветовых каналах, то есть цветной градиент или градиент в градациях серого. В то время как я хочу применить градиент к каналу альфа.

Из руководства по обмену мгновенными сообщениями я понимаю, что для этого можно использовать оператор -compose CopyOpacity. Однако похоже, что это копирует альфа-канал с маски на мое изображение. Мне нужно «применить» этот цвет градиента к моему существующему альфа-каналу, поэтому в основном мне нужно, чтобы альфа-канал моего изображения был умножен на цвет оттенков серого из градиентного изображения.

Какая будет правильная командная строка IM для выполнения операции, показанной выше?


person RocketNuts    schedule 02.11.2016    source источник


Ответы (1)


Вот один из способов сделать это:

convert tree.png -write MPR:orig -alpha extract \
  \( +clone -colorspace gray -fx "1-j/h" \)     \
  -compose multiply -composite -write alpha.png \
  MPR:orig +swap -compose copyopacity -composite result.png

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

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

Символ -write alpha.png можно не указывать - он просто показывает альфа-слой для отладки и иллюстраций.

MPR - это всего лишь временная копия исходного изображения, которое я храню в памяти, пока копаюсь в альфа-канале, и которое я возвращаю ближе к концу. Градиент в альфа-канале создается -fx, и я сначала сделал цветовое пространство серым, поэтому его нужно запускать только один раз, а не три раза.

Если бы вы заранее знали размеры изображения дерева, вы могли бы заменить часть в скобках на:

-size WxH gradient:black-white

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

person Mark Setchell    schedule 02.11.2016
comment
Спасибо, использование MPR: и -fx было для меня в новинку! Вдохновленный вашим решением, теперь я делаю это так: convert tree.png \( +clone -alpha extract \( +clone -fx "1-(i+j*w/h)/(2*w)" \) -compose multiply -composite \) -compose CopyOpacity -composite result.png где -fx "1-(i+j*w/h)/(2*w)" создает диагональный градиент - person RocketNuts; 03.11.2016