Blt () для создания эффекта слоя. Не работает. Я использую неправильную логическую функцию или что-то в этом роде?

У меня есть одно окно, которое привлекается различными объектами для создания многослойного эффекта (представьте себе отображение заголовка, где один объект рисует компас, другой рисует линии сетки, другой - показания высотомера и т. Д.). Итак, у каждого объекта есть растровое изображение черной памяти, в которое он рисует. Когда я вызываю эту функцию Draw, растровое изображение памяти переносится в окно приложения. Все точечные рисунки памяти сначала черные, и объект рисует на них. Черный - прозрачный цвет, поэтому он маскируется. В результате получается эффект наложения.

Итак, я использовал OR в качестве логической функции в функции blt (), и это сработало. Но я заметил, что если предыдущий слой был окрашен в белый цвет, то слой, который рисует поверх него, выглядит так, как если бы он находился под предыдущим слоем. Этот эффект проявляется только в белом (иш) цвете. Все остальные цвета окрашены правильно (то есть слой выглядит так, как будто он нарисован поверх предыдущего и т. Д.). Кто-нибудь видел это явление?


person max    schedule 08.06.2009    source источник


Ответы (4)


Вы используете для этого неправильную функцию. Использование BitBlt с логическим ИЛИ будет работать, если пиксель, который вы пытаетесь перезаписать, окажется черным, но если вы объедините два ненулевых цвета с ИЛИ, вы получите странные результаты. Попробуйте вместо этого использовать TransparentBlt. Эта функция позволяет вам явно указать, какой цвет должен быть прозрачным.

person Peter Ruderman    schedule 08.06.2009

Прошло некоторое время с тех пор, как я использовал GDI, но я предполагаю, что вы говорите о функции BitBlt, верно? Что именно вы делаете вместе? Насколько я помню, BitBlt просто берет исходный и целевой HDC, прямоугольники и некоторые флаги.

Вы выполняете операцию ИЛИ битов растровых изображений для достижения эффекта наложения? Это не сработает, поскольку оператор ИЛИ ассоциативен и коммутативен. Другими словами,

a | b == b | a

и

(a | b) | c == a | (b | c)

Это означает, что порядок, в котором вы выполняете ИЛИ, не влияет на результат. Вам просто нужно копировать каждое растровое изображение по одному, чтобы получить эффект наложения.

Если это не поможет, прошу прощения, я, возможно, полностью неверно истолковал ваш вопрос, поскольку прошло несколько лет с тех пор, как я даже смотрел на GDI.

person Niki Yoshiuchi    schedule 08.06.2009

Зачем возиться с BitBlt и OR? Просто используйте AlphaBlend (), которая дает вам целый байт прозрачности.

person Roel    schedule 10.06.2009
comment
В общем, GDI не очень хорошо справляется с альфа-каналом (или сохраняет его). Если Макс хочет использовать GDI для рисования линий сетки, компаса и других наложений, ему придется проделать большую работу, чтобы сгенерировать альфа-канал вручную. - person Adrian McCarthy; 10.06.2009

То, что вы хотите сделать, требует двух блитов: один для маскировки частей растрового изображения назначения (с использованием пиксельного И), а второй - для пиксельного ИЛИ цветов из наложения на место назначения.

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

screen AND mask OR overlay

И если это для полноэкранного режима, вы можете захотеть выполнить композицию в растровом изображении вне экрана, чтобы избежать мерцания.

Предложение Питера Рудермана использовать TransparentBlt, вероятно, хорошее, хотя сам я никогда не пробовал.

person Adrian McCarthy    schedule 10.06.2009