绘图时,GDI函数将alpha通道设置为0。为什么?

时间:2012-10-12 10:11:21

标签: c++ transparency gdi

我创建了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.我想确定它是一种“合法行为”。

1 个答案:

答案 0 :(得分:3)

这是因为在最初设计Windows GDI之后,alpha混合已经成为绘图功能的一部分。您必须使用相对较新的函数,例如AlphaBlend()(自Windows 2000 AFAIK以来)才能获得该功能。

最初设计GDI使得由RGB宏组成的32位颜色值COLORREF包含类似0x00bbggrr的颜色。所以就像你看到的......你认为alpha通道位不是。这些实际上被GDI设置为零。通过使用掩模实现透明度,而不是使用α混合。

GDI COLORREF的二进制形式由我给出的链接记录,因此代码的行为是合法的(直到MS更改文档的不太可能的事件)。