【发布时间】:2011-04-25 23:03:11
【问题描述】:
在 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 的颜色深度如何,它总是会创建一个有效的透明蒙版。
【问题讨论】:
-
GDI 卡在 24bpp。 TransparentBlt() 有点不寻常,它被记录为支持 32bpp。或许是时候转向 GDI+了。