Я создал 32-битный раздел DIB, заполнил его ненулевыми значениями (FillMemory) и нарисовал его, используя функцию GDI.
Я посмотрел на память раздела DIB и увидел, что каждый 4-й байт (альфа-канал) теперь имеет 0.
У меня было объяснение этому поведению несколько лет назад, но мне не удалось найти его снова (и я не могу вспомнить, почему GDI действует так).
Кто-нибудь знает, почему это GDI-функции устанавливает альфа-канал на 0? Есть ли спецификация для этого поведения?
Идея заключается в следующем:
dib = CreateDIBSection(hdc..., &bytes);
FillMemory(bytes,...255);
memdc = CreateCompatibleDC(hdc);
SelectObject(memdc, bid);
MoveTo(memdc,...);
LineTo(memdc,...);
// look at every pixel in bytes
// if alpha == 255 then it is undrawn pixel
// and set alpha + premultiply colors otherwise
AlphaBlend(hdc, ... memdc,...);
Этот код работает. Но предполагается, что функции GDI устанавливают альфа на 0. Я хочу быть уверен, что это «законное поведение».
Это связано с тем, что альфа-смешивание стало частью функций рисования задолго до того, как Windows GDI был изначально разработан. Вы должны использовать относительно новые функции, такие как AlphaBlend () (существует с Windows 2000 AFAIK), чтобы получить функцию.
Первоначально GDI был разработан так, чтобы 32-битное значение цвета COLORREF состоит из RGB
макрос содержит такие цвета 0x00bbggrr
, Итак, как вы видите … то, что вы думаете, биты альфа-канала не так. Они фактически обнуляются GDI. Прозрачность была достигнута с использованием масок, а не альфа-смешивания.
Бинарная форма GDI COLORREF
задокументировано по приведенной мной ссылке, поэтому поведение вашего кода является законным (до тех пор, пока MS не изменит документацию).
Других решений пока нет …