6

GetHBitmapを使用せずにBitBltを使用してGDI+ビットマップから直接コピーすることは可能ですか?

GetHBitmapは、BitBltコピーに加えて、画像全体の新しいコピーを作成するため低速であり、指定されたHBITMAPを破棄する必要があります。画像が大きいです。

元のGDI+画像のピクセルデータを使用するようにBitBltを指定する方法はありますか?

編集: GDI+ビットマップピクセルデータがメモリ内のどこにあるかへのポインタを取得できます。余分なコピーを回避するためにGDI+ビットマップピクセルデータを指すHBITMAPを作成し、そこからBitBltを作成できますか?

4

1 に答える 1

8

何日も探した後、突然、答えがずっと私をじっと見つめていたことに気づきました!ポインタからバイト配列へのGDI+ビットマップを作成していました。次に、同じポインタを使用してHBITMAPを作成しようとします。しかし、最初にHBITMAPを簡単に作成し、そこからのポインターを使用してGDI+ビットマップを作成することもできます。

それは魅力のように機能します!GDIとGDI+の操作を好きなように組み合わせることができます。画像は、プレーンGDIとGDI+の両方を同時に使用できます。DrawImageを使用する代わりに、まったく同じピクセルデータからBitBltを使用できます。

コードは次のとおりです。

// Create the HBITMAP
BITMAPINFO binfo = new BITMAPINFO();
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO));
binfo.biWidth = width;
binfo.biHeight = height;
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat);
binfo.biPlanes = 1;
binfo.biCompression = 0;

hDC = CreateCompatibleDC(IntPtr.Zero);

IntPtr pointer;
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0);

// Create the GDI+ bitmap using the pointer returned from CreateDIBSection
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer);
于 2011-01-04T20:15:50.880 に答える