5

Используя GraphicsMagick, довольно легко заменить один цвет прозрачностью ...

gm convert -transparent magenta src.png dst.png

К сожалению, я не могу найти простой способ сделать прямо противоположное. Если у меня есть файл изображения с прозрачностью альфа-канала, как мне скомпоновать его на фоне с постоянным цветом, а затем отбросить избыточный альфа-канал? Цвет фона должен влиять на пиксели, которые были частично прозрачными, а также полностью прозрачными.

Я заметил опцию +matte, но он буквально отбрасывает альфа-слой - обычно оставляя нежелательные цветные пиксели там, где была прозрачность, а не, например, используя опцию -background, чтобы указать цвет фона для использования.

Единственный способ, которым я до сих пор справлялся, - это использование нескольких вызовов - один для создания файла изображения в виде сплошного прямоугольника, другой для компоновки исходного изображения со сплошным изображением, а третий для сброса альфа-канала. Это кажется сумасшедшим - конечно, это должно быть возможно с одним довольно простым вызовом?

В настоящее время я использую GraphicsMagick, но никаких обязательств нет - я переключусь на ImageMagick, если это облегчит задачу.

РЕДАКТИРОВАТЬ

Когда я говорю «Цвет фона должен влиять на пиксели, которые были как частично прозрачными, так и полностью прозрачными», я имею в виду, что результат должен быть визуально тем, чего я обычно ожидаю от перетекания прозрачного спрайта на однотонный фон. Частично прозрачные пиксели должны быть смешаны.

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

3 ответа3

6

При использовании GraphicsMagick -background color -extent 0x0 должна быть в состоянии заменить первые два шага в вашем процессе (для ImageMagick это будет -mosaic вместо -extent). Я не уверен насчет третьего шага, но похоже, что вы просто запускаете +matte на изображении с первых двух шагов, поэтому последний вызов будет выглядеть примерно так:

gm convert -background color -extent 0x0 +matte src.png dst.png

или для ImageMagick,

convert src.png -background color -mosaic +matte dst.png
1

Мне кажется, что вы просто хотите объединить прозрачное (или частично) изображение поверх фона с альфа-смешиванием. Эта страница предполагает, что код:

composite smile.gif rose: rose-over.png

это основа. В приведенных примерах он смешивает одно изображение с другим.

Теперь, если вы хотите смешать изображение с прозрачностью по сравнению со сплошным фоновым цветом, вы можете создать второе изображение с фоном (если оно статичное) или создать базовое одноцветное / заполненное изображение с такими же размерами в во время выполнения. То, как вы это сделаете, зависит от того, используете ли вы оболочку или какой-то другой скрипт (Perl, PHP и т.д.).

1

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

gm convert -channel matte -threshold 0% -channel RGB -fill [your background color] -opaque transparent -channel matte -threshold 100% src.png dst.png

-channel matte -threshold 0% устанавливает пиксели с любой прозрачностью на полностью прозрачные, -channel RGB -fill [your background color] -opaque transparent заменяет полностью прозрачные пиксели с заданным цветом заливки, а -channel matte -threshold 100% удаляет прозрачность из все пиксели.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .