【问题标题】:GDI functions set alpha channel to 0 when drawing. Why?GDI 函数在绘制时将 alpha 通道设置为 0。为什么?
【发布时间】:2012-10-03 03:18:07
【问题描述】:

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

【问题讨论】:

    标签: c++ transparency gdi


    【解决方案1】:

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

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

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

    【讨论】:

    • 其实我使用DIB部分来获得透明度。但是 AlphaBlend 将所有绘制的对象视为透明的,因为 GDI 函数将 alpha 通道设置为 0。
    • @sibvic 是的,GDI 将它们设置为 0,因为在 GDI 文档中,直到今天这些位都是 0(它们不是 Alpha 通道位)。
    猜你喜欢
    • 2023-03-31
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多