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

StackOverflow https://stackoverflow.com/questions/4588132

  •  14-10-2019
  •  | 
  •  

Вопрос

Можно ли использовать 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top