Пиксельное альфа-смешивание компонентов в GDI - PullRequest
1 голос
/ 27 мая 2010

У меня есть 24-битные растровые изображения с цветными каналами R, G, B и 24-битные растровые изображения с альфа-каналами R, G, B.Я хочу альфа-смешать первое растровое изображение с HDC в GDI или RenderTarget в Direct2D с альфа-каналами соответственно.Например, предположим, что для одного пикселя цвет растрового изображения равен (192, 192, 192), цвет HDC - (0, 255, 255), а альфа-каналы - (30, 40, 50).Окончательный цвет HDC должен быть (22, 245, 242).Я знаю, что могу сначала привязать HDC к HDC памяти, выполнить альфа-смешение, вручную вычислив цвет каждого пикселя и, наконец, вернуть BitBlt.Я просто хочу избежать лишних бликов и оставить API-интерфейсы выполнением своей работы (быстрее, поскольку они находятся в пространстве ядра).

Первая идея, которая приходит мне в голову, состоит в том, чтобы разбить исходный битовый массив на 3 только для красного, зеленого- только и только синие 8-битные растровые изображения, выполните нормальное альфа-смешивание, затем объедините 3 выходных растровых изображения в HDC.Но я не нахожу способ сделать разделение и композицию изначально в Windows (поможет ли слой Direct2D?).Кроме того, разбиение и компоновка могут потребовать много дополнительного копирования.Слишком высокие показатели производительности.

Или, возможно, сделать альфа-смешивание за 3 прохода.Каждый проход применяет смешивание для одного канала, в то время как остальные 2 остаются неизменными.

Спасибо за любой комментарий.

РЕДАКТИРОВАТЬ: Я нашел этот вопрос , и ответ долженбыть хорошей ссылкой на эту проблему.Однако, кроме AC_SRC_OVER, не поддерживается другая операция наложения.Почему Microsoft не улучшит их API?

1 Ответ

1 голос
/ 19 июня 2010

Я почти уверен, что альфа-канал не поддерживается в стандартных библиотеках Windows или OSX. Возможно, вы захотите работать с 3 слоями независимо (обрабатывать каждый слой как отдельное 32-битное растровое изображение) и затем создавать их.

...