2

32 ビット イメージ (アルファ チャネル付きの PNG) を 32 ビット ビットマップ (または Bitmap32) にブリットしたいと考えています。

イメージをブライトする代わりにブレンドするように関数に指示する方法がわかりません。BitBlt の代わりに AlphaBlend を使用するように、単純なブリットではなく画像をブレンドするためにこの関数を作成する必要があります。

これは私の例です:

ABitmap は TBitmap32 (GR32) のタイプですが、32 ビット パレットの通常の TBitmap でも同じ結果になります。

    ABitmap.SetSize(GetWidth, GetHeight);
    SetStretchBltMode(ABitmap.Handle, COLORONCOLOR);//HALFTONE);
    ABitmap.Clear($FFFFFFFF);  { Here I try to erase background with white color, so that new image is blit over white surface }
    StretchDIBits(
      ABitmap.Handle,
      0, 0,
      GetWidth, GetHeight,
      0, 0,
      GetWidth, GetHeight,
      FreeImage_GetBits(Dib),
      FreeImage_GetInfo(Dib)^,
      DIB_RGB_COLORS,
      SRCCOPY);    // --- SRCAND etc. produce not good results

FreeImage_GetBits と FreeImage_GetInfo は、ビット配列の先頭と構造体を指す FreeImage ライブラリ関数です。

私が何をしても、StretchDBit はブレンドを許可しません。

4

1 に答える 1

2

StretchDIBits()アルファブレンディングの概念はありません。最初に PNG を一時的な 32 ビット ビットマップにブリットし、必要に応じてそのアルファ チャネルを設定してからAlphaBlend()、一時的なビットマップを宛先ビットマップに設定する必要があります。AlphaBlend()または、 PNG が既に 32 ビット ビットマップを使用してメモリに配置されている場合は、PNG を目的のビットマップに直接転送することもできます。

于 2012-05-11T02:26:15.943 に答える