在 Win32 下,通过执行以下操作从位图生成单色位掩码以供透明度使用是一种常见技术:
SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
假设 hdcSource 是保存源图像的内存 DC,hdcMask 是保存相同大小的单色位图的内存 DC(因此两者都是 32x32,但源是 4 位颜色,而目标是 1 位单色)。
然而,当源是 32 位颜色 + alpha 时,这对我来说似乎失败了。我没有在 hdcMask 中获得单色位图,而是获得全黑的蒙版。没有位设置为白色 (1)。而这适用于 4 位颜色源。
我的 search-foo 失败了,因为我似乎找不到任何对此特定问题的引用。
我发现这确实是我的代码中的问题:即,如果我使用 16 色(4 位)的源位图,它就可以工作;如果我使用 32 位图像,它会生成全黑蒙版。
对于 32 位彩色图像,我应该使用其他方法吗? Alpha 通道是否存在覆盖上述技术正常行为的问题?
感谢您提供的任何帮助!
附录:我仍然无法找到一种技术来为我的 GDI+ 生成的源位图创建有效的单色位图。
我通过根本不生成单色位掩码在一定程度上缓解了我的特殊问题,而是使用TransparentBlt(),这似乎是正确的(但我不知道他们在内部做了什么,这与允许他们正确地掩盖图像)。
拥有一个非常好的、有效的函数可能会很有用:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
无论 hSource 的颜色深度如何,它始终创建有效的透明度蒙版。