C++ 绘制时,GDI函数将alpha通道设置为0。为什么?
我已经创建了32位DIB部分,用一些非零值(FillMemory)填充它,并使用GDI函数在它上面画图。 我查看了DIB部分的内存,发现现在每4个字节(alpha通道)都有一个0。 我在几年前就有过这种行为的解释,但没能再次找到它(也不记得GDI为什么会这样做)。 有人知道为什么GDI函数将alpha通道设置为0吗?这种行为有什么规范吗 这个想法是:C++ 绘制时,GDI函数将alpha通道设置为0。为什么?,c++,transparency,gdi,C++,Transparency,Gdi,我已经创建了32位DIB部分,用一些非零值(FillMemory)填充它,并使用GDI函数在它上面画图。 我查看了DIB部分的内存,发现现在每4个字节(alpha通道)都有一个0。 我在几年前就有过这种行为的解释,但没能再次找到它(也不记得GDI为什么会这样做)。 有人知道为什么GDI函数将alpha通道设置为0吗?这种行为有什么规范吗 这个想法是: dib = CreateDIBSection(hdc..., &bytes); FillMemory(bytes,...2
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混合就已经成为绘图功能的一部分了。您必须使用相对较新的功能,如(自Windows2000AFAIK以来就存在)来获得该功能 最初,GDI的设计使由
RGB
宏组成的32位颜色值包含类似0x00bbggrr
的颜色。就像你看到的。。。你认为是alpha通道的比特不是。GDI实际上将这些设置为零。透明度是通过使用遮罩而不是alpha混合来实现的
GDI
COLORREF
的二进制形式由我提供的链接记录,因此您的代码行为是合法的(直到MS更改文档的不太可能的事件发生) 这是因为早在Windows GDI最初设计之后,alpha混合就已经成为绘图功能的一部分。您必须使用相对较新的功能,如(自Windows2000AFAIK以来就存在)来获得该功能
最初,GDI的设计使由RGB
宏组成的32位颜色值包含类似0x00bbggrr
的颜色。就像你看到的。。。你认为是alpha通道的比特不是。GDI实际上将这些设置为零。透明度是通过使用遮罩而不是alpha混合来实现的
GDI
COLORREF
的二进制形式由我提供的链接记录,因此您的代码行为是合法的(直到MS更改文档的不太可能的事件发生) 实际上,我使用DIB部分来获得透明度。但是AlphaBlend将所有绘制的对象视为透明的,因为GDI函数将alpha通道设置为0。@sibvic是的,GDI将它们设置为0,因为在GDI文档中,直到今天位都是0(它们不是alpha通道位)。实际上,我使用DIB部分来获得透明度。但是AlphaBlend将所有绘制的对象视为透明对象,因为GDI函数将alpha通道设置为0。@sibvic是的,GDI将它们设置为0,因为在GDI文档中,直到今天,位都是0(它们不是alpha通道位)。