Question

Est-il possible d'utiliser BitBlt pour copier directement d'un bitmap GDI + sans utiliser GetHBitmap?

GetHBitmap est lente, car elle fait une nouvelle copie de l'image, en plus et plus lent que la copie BitBlt et le HBITMAP donné doit être disposé. L'image est grande.

Y at-il un moyen de pointer BitBlt d'utiliser les données de pixels de l'image originale GDI +?

EDIT: Je peux obtenir un pointeur à l'endroit où les données de pixels bitmap GDI + est dans la mémoire. Puis-je créer un HBITMAP qui pointe vers les données de pixels bitmap GDI + pour éviter la copie supplémentaire et BitBlt de cela?

Était-ce utile?

La solution

Après avoir cherché pendant des jours, il m'a frappé tout à coup que la réponse avait été me regarder en face tout le temps! Je suis en train de créer une image bitmap GDI + à partir d'un pointeur vers un tableau d'octets. Ensuite, en essayant de créer un HBITMAP en utilisant le même pointeur. Mais je pourrais tout aussi bien créer la HBITMAP d'abord et utiliser le pointeur de celui pour créer le bitmap GDI +.

Il fonctionne comme un charme! Vous pouvez mélanger les opérations GDI et GDI + comme bon vous semble. L'image est à la fois simple + GDI et GDI à la fois. Au lieu d'utiliser DrawImage, vous pouvez BitBlt à partir des mêmes données de pixels exactes!

Voici le code:

// 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top