Используя GraphicsMagick, довольно легко заменить один цвет прозрачностью ...
gm convert -transparent magenta src.png dst.png
К сожалению, я не могу найти простой способ сделать прямо противоположное. Если у меня есть файл изображения с прозрачностью альфа-канала, как мне скомпоновать его на фоне с постоянным цветом, а затем отбросить избыточный альфа-канал? Цвет фона должен влиять на пиксели, которые были частично прозрачными, а также полностью прозрачными.
Я заметил опцию +matte, но он буквально отбрасывает альфа-слой - обычно оставляя нежелательные цветные пиксели там, где была прозрачность, а не, например, используя опцию -background, чтобы указать цвет фона для использования.
Единственный способ, которым я до сих пор справлялся, - это использование нескольких вызовов - один для создания файла изображения в виде сплошного прямоугольника, другой для компоновки исходного изображения со сплошным изображением, а третий для сброса альфа-канала. Это кажется сумасшедшим - конечно, это должно быть возможно с одним довольно простым вызовом?
В настоящее время я использую GraphicsMagick, но никаких обязательств нет - я переключусь на ImageMagick, если это облегчит задачу.
РЕДАКТИРОВАТЬ
Когда я говорю «Цвет фона должен влиять на пиксели, которые были как частично прозрачными, так и полностью прозрачными», я имею в виду, что результат должен быть визуально тем, чего я обычно ожидаю от перетекания прозрачного спрайта на однотонный фон. Частично прозрачные пиксели должны быть смешаны.
Это означает, что если бы я затем повернул процесс вспять - превратив клавишу цвета фона в прозрачность, - я бы ожидал увидеть ореол вокруг исходного изображения, где цвет фона смешивается с пикселями, так что клавиша цвета не точно совпадает, и поэтому не преобразуется обратно в прозрачность. Это не то, что большинство людей хотели бы по этой причине. Это то, что я хочу, так как я не буду преобразовывать фон обратно в прозрачность - у меня все еще будет исходное изображение с исходной прозрачностью, если мне это нужно.