2

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

4

1 回答 1

4

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

最初 GDI 被设计成由宏组成的32 位颜色值COLORREFRGB包含这样的颜色0x00bbggrr。所以就像你看到的......你认为的阿尔法通道位不是。这些实际上由 GDI 设置为零。透明度是通过使用蒙版而不是 alpha 混合实现的。

GDI 的二进制形式COLORREF由我给出的链接记录,因此您的代码行为是合法的(除非 MS 更改文档的可能性很小)。

于 2012-10-12T10:31:29.370 回答