使用BMP文件中的alpha通道创建HBITMAP

时间:2012-08-30 02:44:48

标签: winapi gdi

我开始使用PNG图像。然后我将alpha通道拆分为灰度BMP文件,并将PNG转换为BMP。 我想加载两个BMP文件并合并它们以给HBITMAP一个alpha通道:

HBITMAP splash = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SPLASH));
HBITMAP splashMask = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_SPLASH_MASK));
HBITMAP splashAlpha = ....

我发现了example直接从PNG创建HBITMAP。它使用IStream和COM来进行导入。我宁愿不包含更多依赖项。当然有更好的方法来做到这一点?

1 个答案:

答案 0 :(得分:1)

如果您正在寻找最少的代码,则应考虑将PNG转换为32位位图并使用AlphaBlend API绘制它们。

BLENDFUNCTION fn;
ZeroMemory(&fn, sizeof(fn));
fn.BlendOp = AC_SRC_OVER;
fn.BlendFlags = 0;
fn.SourceConstantAlpha = 255;
fn.AlphaFormat = AC_SRC_ALPHA;
AlphaBlend(dstDC, dstX, dstY, dstW, dstH, hdcSrc, srcX, srcY, srcW, srcH, fn);

问题是hdcSrc应该引用32位BGRA图像,其中Alpha通道被预乘到BGR通道中,即

B = B * A / 255;
G = G * A / 255;
R = R * A / 255;