Да, это возможно. Позвольте мне описать, как это делается, используя это изображение из Wikimedia Commons (автор ed_g2s , лицензированный как CC-By-SA 3.0 ) в качестве примера:
Откройте черно-белые фоновые версии как слои одного и того же изображения (используя « Открыть как слои» или просто откройте и скопируйте и вставьте одну в другую). Переместите белый слой над черным, если это не так. Два слоя должны выглядеть примерно так:
Возьмите разницу между слоями: клонируйте черный слой (он понадобится вам позже), измените режим слоя белого слоя на «различие» и объедините его. Инвертировать результат. Это дает вам альфа-канал исходного изображения.
Изменить: Если ваш фон не черный и белый, инвертированный слой различий не будет иметь черный фон. Чтобы это исправить, сначала обесцветьте слой (используя тот режим, который обеспечивает наилучшую контрастность), а затем используйте Цвета → Авто → Нормализация, чтобы сделать фон черным. Вы также можете использовать Channel Mixer , но это немного сложнее.
( Нормализация выше работает, если воссоздаемый альфа-канал имеет хотя бы некоторые части с непрозрачностью 100%; если воссоздаемое изображение везде полупрозрачное, вы можете использовать Цвета → Уровни ..., чтобы вместо этого установить только черную точку. )
Если у вас его еще нет, вам также нужно создать версию вашего изображения с черным фоном для следующего шага. Для этого используйте следующие дополнительные шаги:
- Выберите любую оригинальную версию с темным фоном. Создайте новый слой поверх него, заполненный цветом фона.
- Клонируйте разностный слой и переверните его, чтобы он имел белый фон. Поместите этот слой поверх нового сплошного цвета, который вы только что создали, установите его режим слоя на «умножение» и объедините его.
- Наконец, измените режим результирующего слоя на «вычитание» и объедините его с слоем с исходным изображением. Это должно вычесть исходный фон, оставив изображение на черном фоне.
Если бы мы использовали формат изображения с предварительно умноженной альфой, мы бы более или менее сделали это сейчас. Но так как мы не являемся, нам все еще нужно демультиплексировать каналы RGB. Чтобы сделать это, клонируйте альфа-слой, который мы создали на предыдущем шаге (или просто скопируйте его в буфер обмена), установите его режим слоя на «деление» и объедините его с черным фоновым слоем, который был клонирован до шага 2. Результат должен выглядеть следующим образом (сравните с оригинальной черной фоновой версией, чтобы увидеть разницу):
Теперь добавьте маску слоя к полученному слою, выберите маску и вставьте в нее альфа-слой. Результат теперь должен выглядеть более или менее как исходное прозрачное изображение. Наконец, чтобы превратить маску в правильный альфа-канал, вы можете применить ее (но экспорт GIMP в PNG сделает это за вас, даже если вы этого не сделаете). И вот вы - один восстановленный прозрачный PNG, готовый к работе:
Конечно, эта техника действительно требует наличия версий изображения на чистом черном и чистом белом фоне. Если фон немного отклонен, аналогичные методы могут все еще использоваться, но вам, возможно, придется сделать дополнительные корректировки цвета, и результаты могут быть не столь идеальными. ( Изменить: см. Дополнения к шагу 2 выше. Измененные инструкции должны работать с фонами любого цвета, если они сплошные.)
Ps. GIMP также имеет функцию «Стирание цвета» (в качестве режима наложения для инструмента «Заливка» или « Цвет для альфа- канала ... для всего изображения»), которая полезна для восстановления прозрачности, когда у вас есть только одна версия изображения. на сплошном цветном фоне. Однако, если его не использовать осторожно, он имеет тенденцию создавать более прозрачный вывод, чем вы, вероятно, хотели бы .
Pps. Если вы очень тщательно сравните исходное и восстановленное изображения, вы увидите, что они не совсем идентичны - некоторые значения цвета смещены на 1/256 или около того. Это связано с тем, как работает режим «разделить» слой в GIMP : вместо вычисления истинного обратного коэффициента альфа-умножения, который будет иметь вид output = (255 × input ) / layer , он фактически вычисляет output = (256 × input ) / ( layer+1) Это несоответствие, которое якобы сделано для того, чтобы избежать деления на ноль, означает, что некоторые цвета могут округляться до немного отличного значения, чем они должны. Увы, я не знаю другого пути, кроме как исправить патч GIMP, написать плагин для деления, как мы хотим, или использовать какую-то другую программу. К счастью, разница в цвете редко, если вообще ощущается человеческим глазом.