Используя GraphicsMagick, довольно легко заменить один цвет прозрачностью...
gm convert -transparent magenta src.png dst.png
К сожалению, я не могу выяснить простой способ сделать полную противоположность. Если у меня есть файл изображения с прозрачностью альфа-канала, как я сочиняю, она на постоянном цветовом фоне затем отбрасывает теперь избыточный альфа-канал? Цвет фона должен влиять пиксели, которые были частично прозрачны, а также полностью прозрачны.
Я определил +matte опцию, но она буквально отбрасывает альфа-слой - обычно оставляющий пиксели цвета спама, где прозрачность была, а не например, использование - фоновая опция указать цвет фона для использования.
Единственным путем я справился, это до сих пор использует множественные вызовы - один для генерации прямоугольного файла изображения чистого цвета, другой для составления композита исходного изображения с изображением чистого цвета и одной трети для отбрасывания альфа-канала. Это кажется сумасшедшим - конечно, это должно быть возможно с единственным довольно простым вызовом?
Я в настоящее время использую GraphicsMagick, но нет никакого обязательства - я переключусь на ImageMagick, если он сделает вещи легче.
Править
Когда я говорю, что "Цвет фона должен влиять пиксели, которые были частично прозрачны, а также полностью прозрачны". я подразумеваю, что результат должен быть явно, что я обычно ожидал бы от блитирования прозрачного спрайта на фон сплошного цвета. Частично прозрачные пиксели должны быть смешаны.
Это означает, что, если бы я затем инвертировал процесс - превращение ключа цвета фона в прозрачность - я ожидал бы видеть ореол вокруг исходного изображения, где цвет фона смешивается в пиксели, таким образом, цветной ключ точно не соответствует и поэтому не преобразовывается назад в прозрачность. Это не то, что большинство людей хотело бы по этой причине. Это - то, что я хочу, тем не менее, поскольку я не буду преобразовывать предпосылки назад к прозрачности - у меня все еще будет исходное изображение с исходной прозрачностью, если мне будет нужен он.
Использование 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
Что Вы ищете, почти соответствует описанию - непрозрачный, но со скручиванием. Принимая постоянный цветовой фон, команда ниже могла бы работать на Вас (у меня только есть 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%
удаляет прозрачность из всех пикселей.
Это смотрит на меня как Вы, просто хотят составить прозрачное (или частично) изображение по фону, с альфа-смешиванием. Эта страница предполагает что код:
composite smile.gif rose: rose-over.png
основание. В данных примерах это смешивает одно изображение по другому.
Теперь, если Вы хотите смешать изображение с прозрачностью по цвету сплошного фона, у Вас может или быть второе изображение с фоном (если это статично), или создайте основное single-color/flood-filled изображение тех же размеров во времени выполнения. Как Вы сделали бы, который зависит от того, если Вы используете оболочку или некоторый сценарий (Perl, PHP, и т.д.).