2012-05-10 132 views
2

32ビットのビットマップ(またはビットマップ32)上で32ビットイメージ(アルファチャンネルのPNG)をblitしたいと思います。StretchDIBitsの問題

blingではなく、イメージをブレンドする方法をわかりません。 BitBltの代わりにAlphaBlendを使うのと同じように、この関数を単純なblitの代わりにイメージをブレンドする必要があります。

これは私の例である:

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ではブレンドができません。

答えて

2

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

+0

アルファブレンディングの概念全体は、ほとんどのGDI関数とは異質です。それはゲームの非常に遅い時にボルトで止められました。 –

+2

真。最後の1年か2年の間に、VCLの 'TCanvas.Draw()'メソッドがビットマップを描画するときに 'AlphaBlend()'を介してアルファブレンディングのサポートを受けました。 –

+0

AlphaBlend関数はメモリ配列の代わりにCanvas.Handle(HDC)を想定しています。それはDDBであり、DIB(Device Independed Bitmap)機能ではありません。私はいくつかのDIBブレンド機能を探しています。 –