タイプの有効なHBITMAP
ハンドルがありARGB
ます。GDI+を使用して描画するには?
私は方法を試しました:
graphics.DrawImage(Bitmap::FromHBITMAP(m_hBitmap, NULL), 0, 0);
ただし、アルファチャンネルは使用しません。
動作するサンプルがあります:
ビットマップハンドルを使用して情報を取得する:画像サイズ、ビット
BITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;
ピクセルフォーマットPixelFormat32bppARGBのビットを使用して新しいGDI+ビットマップを作成および描画します
Gdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);
透過的なチャネルを機能させるために同様の問題が発生しました。私の場合、透明な領域に背景色を使用する必要があることを知っていました(それは無地でした)。Bitmap.GetHBITMAP(..)メソッドを使用し、透明領域に使用する背景色を渡しました。これは、私がLockBitsを使用して、PixelFormat32bppARGBを使用してビットマップを再作成し、クローンを作成しようとした他の試みよりもはるかに簡単なソリューションでした。私の場合、ビットマップはBitmap.FromStreamから作成されたため、アルファチャネルを無視していました。
また、画像の背景領域がわずかに変更されるという非常に奇妙な問題がありました。たとえば、真っ白ではなく、0xfff7f7のようにオフホワイトでした。これは、JPG(混合色)を使用していたか、PNGと透明色を使用していたかに関係なく当てはまりました。
で私の質問と解決策を参照してください
ああ...しかし、.NetはHBITMAPを使用せず、GDI+は基本的なWindows GDIの上にあるC++ライブラリであるため、.Net以外のC++を使用していると仮定しています。
GDI+ には、FromHBITMAP() メソッドを持つ Bitmap クラスがあります。
GDI+ ビットマップ インスタンスを取得したら、それを GDI+ ライブラリで使用できます。
もちろん、.Net を使用して C# でプログラムを記述できれば、はるかに簡単になります。