У нас есть два изображения:
исходное, с чёрным фоном:
и его маска, с белым фоном:
Мне нужно:
Получить вместо чёрного фона прозрачность так, чтобы в случае чёрных контуров у спрайта, они отображались. Потому что, если выполнять просто хромакей по чёрному фону, то контуры тоже будут прозрачными. Известно, что можно выйти из ситуации рисованием контуров ЧУТЬ-более светлым, чем чёрным (например, фон #000000 а контуры #000001), но это не подходит, потому проект планируется для пользовательских спрайтов. Прозрачность должна проявляться именно там, где на маске белый фон совпадает с чёрным фоном на оригинале.
+
=
В альфа-канале нет необходимости.
Использую для работы библиотеку SDL на С++.
________________________________________________________________________
Хотя есть предположение:
Цвет на маске: должен вычитать цвет из альфа-канала соответствующего пикселя на каждом изображени, но на исследуемом ПО видел, что если под маску попадал не чёрный цвет, он начинает смешиваться с фоном и получается грязь:
Эксперимент в исследуемом ПО с неправильной маской:
Исходник и маска:
Результат:
UPD: Спустя время выяснил, какой на самом деле применяется алгоритм рисования таких изображений:
Для этого использовался алгоритм
битовой маски.
т.е.:
- Сначала отрисовывается маска с побитовым "И" попиксельно с экранными пикселями.
- Затем в том же месте отрисовывется сама картинка, но с побитовым ИЛИ попиксельно с экранными пикселями
Такой алгоритм применялся в исследуемой программе по той причине, что VisualBasic 6, на котором последняя была написана, штатно не поддерживал альфа-канал и отрисовку прозрачных изображений. Почему даже в некоторых примерах и туториалах применялся именно этот метод. В своём движке я применяю PNG-картинки, а старые преобразую смешивая с серым фоном, назначая альфа-канал в зависимости от суммы пикселей маски и самой картинки.
Так-же можно применять маску в качестве инвертированного альфа-канала, однако если маска неправильная (пользователи старого движка очень часто делали "ленивые" маски - скопировали саму картинку, просто залив фон белым), то картинка получается кривой с полупрозрачностями разного уровня (что строго требует использование правильной маски). В итоге когда я сделал
конвертер изображений с масками в PNG, так же сделал и утилиту, которая фиксит "ленивые" маски автоматически.