我已经创建了 32 位 DIB 部分,用一些非零值 (FillMemory) 填充它,并使用 GDI 函数在其上绘图。 我查看了 DIB 部分的内存,发现现在每个第 4 个字节(alpha channel )都有一个 0。 几年前我对这种行为有过解释,但没能再次找到它(并且不记得为什么 GDI 会这样)。 有人知道为什么 GDI 函数将 alpha channel 设置为 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。我想确定这是一种“合法行为”。
最佳答案
这是因为在 Windows GDI 最初设计很久之后,Alpha 混合就已经成为绘图功能的一部分。您必须使用相对较新的函数,例如 AlphaBlend() (自 Windows 2000 AFAIK 起就有)获得该功能。
最初 GDI 的设计是为了 32 位颜色值 COLORREF由 RGB
宏组成,包含类似 0x00bbggrr
的颜色。正如您所看到的...您认为的 alpha channel 位并非如此。这些实际上被 GDI 设置为零。透明度是通过使用 mask 而不是阿尔法混合来实现的。
GDI COLORREF
的二进制形式由我给出的链接记录,因此您的代码行为是合法的(除非 MS 更改文档)。
关于c++ - GDI 函数在绘图时将 Alpha channel 设置为 0。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856839/