c++ - GDI 函数在绘图时将 Alpha channel 设置为 0。为什么?

标签 c++ transparency gdi

我已经创建了 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 位颜色值 COLORREFRGB 宏组成,包含类似 0x00bbggrr 的颜色。正如您所看到的...您认为的 alpha channel 位并非如此。这些实际上被 GDI 设置为零。透明度是通过使用 mask 而不是阿尔法混合来实现的。

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

关于c++ - GDI 函数在绘图时将 Alpha channel 设置为 0。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12856839/

相关文章:

C++ TCP套接字垃圾值

c++ - 如果指针设置为 NULL,则任何对它的引用或通过它的引用也不会是 NULL

c++ - 将负数传递给 Getopt

java - 我通过一些代码使java图像的某些部分透明,它在我制作的笔记本电脑上运行良好,但在其他笔记本电脑上运行不佳,为什么?

android - 如何让状态栏透明但导航栏不透明?

c++ - 如何在 GDI+ 中使用库存对象

c++ - 如何将 itemExpanded 与 QTreeWidgetItem 的子类一起使用

java - 如何保持 JButtons 的透明度 (java)

c++ - 根据纸张大小和允许的最大文本长度计算理想的字体大小

c++ GDI位图不想加载