Можно ли BitBlt непосредственно из растрового изображения GDI+?
Вопрос
Можно ли использовать BitBlt для копирования непосредственно из растрового изображения GDI+ без использования GethbitMap?
Gethbitmap является медленным, потому что он делает новую копию всего изображения, в дополнение к и медленнее, чем копия BitBlt, и необходимо утилизировать заданный HBITMAP. Изображение большое.
Есть ли способ указать BitBlt для использования пиксельных данных исходного изображения GDI+?
РЕДАКТИРОВАТЬ: Я могу получить указатель, где находятся данные пикселя GDI+ Bitmap в памяти. Могу ли я создать HBITMAP, который указывает на данные пикселя GDI+ Bitmap, чтобы избежать дополнительной копии, и BitBlt из этого?
Решение
После поиска в течение нескольких дней, меня внезапно поразило, что ответ все время смотрел мне в лицо! Я создавал растровую карту GDI+ из указателя на массив байтов. Затем попытка создать HBITMAP, используя один и тот же указатель. Но сначала я мог бы сначала создать HBITMAP и использовать указатель, чтобы создать растровый карту GDI+.
Работает как часы! Вы можете смешать операции GDI и GDI+, как вам нравится. Изображение - это просто GDI и GDI+ одновременно. Вместо использования DrawMage вы можете бить из тех же самых пиксельных данных!
Вот код:
// 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);