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