2

我从一张PNG图像开始。然后,我将 Alpha 通道拆分为灰度 BMP 文件,并将 PNG 转换为 BMP。我想加载两个 BMP 文件并将它们合并以提供带有 alpha 通道的 HBITMAP:

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

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

4

1 回答 1

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;
于 2012-08-30T03:53:14.967 回答