Возможно ли BitBlt напрямую из растрового изображения GDI +? - PullRequest
5 голосов
/ 03 января 2011

Можно ли использовать BitBlt для непосредственного копирования из растрового изображения GDI + без использования GetHBitmap?

GetHBitmap работает медленно, потому что он создает новую копию всего изображения, в дополнение и медленнее, чем копия BitBlt, и данный HBITMAP должен быть удален. Изображение большое.

Есть ли способ указать BitBlt на использование данных пикселей исходного изображения GDI +?

РЕДАКТИРОВАТЬ: Я могу получить указатель на то, где данные пикселей растрового изображения GDI + находятся в памяти. Могу ли я создать HBITMAP, который указывает на данные пикселей растрового изображения GDI +, чтобы избежать дополнительной копии, и BitBlt из этого?

1 Ответ

6 голосов
/ 04 января 2011

После поисков в течение нескольких дней меня вдруг поразило, что ответ все время смотрел мне в лицо! Я создавал растровое изображение 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);
...