我创建了32位DIB部分,用一些非零值(FillMemory)填充它并使用GDI函数对其进行绘制。 我查看了DIB部分的内存,发现现在每个第4个字节(alpha通道)都有0。 几年前我对这种行为做了解释,但没有设法再次找到它(并且无法记住为什么GDI会这样做)。 有谁知道为什么它的GDI函数将alpha通道设置为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函数将alpha设置为0.我想确定它是一种“合法行为”。
答案 0 :(得分:3)
这是因为在最初设计Windows GDI之后,alpha混合已经成为绘图功能的一部分。您必须使用相对较新的函数,例如AlphaBlend()(自Windows 2000 AFAIK以来)才能获得该功能。
最初设计GDI使得由RGB
宏组成的32位颜色值COLORREF包含类似0x00bbggrr
的颜色。所以就像你看到的......你认为alpha通道位不是。这些实际上被GDI设置为零。通过使用掩模实现透明度,而不是使用α混合。
GDI COLORREF
的二进制形式由我给出的链接记录,因此代码的行为是合法的(直到MS更改文档的不太可能的事件)。