2

PNG画像から始めました。次に、アルファ チャネルをグレー スケールの BMP ファイルに分割し、PNG を BMP に変換しました。両方の BMP ファイルを読み込み、それらをマージして、アルファ チャネルを持つ 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ビットビットマップに変換し、AlphaBlendAPIを使用して描画することを検討する必要があります

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がアルファチャネルがBGRチャネルに事前に乗算されている32ビットBGRAイメージを参照する必要があるということです。

B = B * A / 255;
G = G * A / 255;
R = R * A / 255;
于 2012-08-30T03:53:14.967 に答える