質問

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);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top