GDI+ BitMapから直接BITBLTを使用することは可能ですか?
質問
GethbitMapを使用せずにGDI+ BitMapから直接コピーするためにBITBLTを使用することは可能ですか?
GethbitMapは、Bitbltコピーよりもさらに遅い画像全体の新しいコピーを作成するため、遅いです。画像は大きいです。
BITBLTを指して、元のGDI+画像のピクセルデータを使用する方法はありますか?
編集: GDI+ビットマップピクセルデータがメモリ内にある場所へのポインターを取得できます。 GDI+ BITMAP PIXELデータを指すHBITMAPを作成して、追加のコピーを避け、BitBltを避けていますか?
解決
数日を探した後、答えがいつも顔を見つめていたことに突然私がぶつかりました!ポインターからバイト配列への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);
所属していません StackOverflow