2011-01-03 19 views
5

È possibile utilizzare BitBlt per copiare direttamente da una bitmap GDI + senza utilizzare GetHBitmap?È possibile eseguire BitBlt direttamente da una bitmap GDI +?

GetHBitmap è lento perché crea una nuova copia dell'intera immagine, oltre che più lenta della copia BitBlt e il dato HBITMAP deve essere smaltito. L'immagine è grande.

C'è un modo per indicare a BitBlt di utilizzare i dati dei pixel dell'immagine GDI + originale?

MODIFICA: È possibile ottenere un puntatore al punto in cui sono presenti i dati del pixel bitmap GDI +. Posso creare un HBITMAP che punta ai dati del pixel bitmap GDI + per evitare la copia extra e BitBlt da quello?

+1

BitBlt copie da un DC ad un altro. Per disegnare una bitmap su un DC, si seleziona la bitmap nel DC sorgente e quindi si BitBlt sulla destinazione. Se questo è quello che vuoi fare con un oggetto GDI + 'Bitmap', non dovresti semplicemente usare' Graphics.DrawImage', dove l'oggetto 'Graphics' racchiude il target DC desiderato? Perché passare attraverso un "HBitmap"? –

+1

Il motivo per cui ho bisogno di BitBlt è che si tratta di operazioni raster. DrawImage non può eseguire un'operazione OR da un'immagine all'altra. E l'ho fatto con bitmap GDI, ma come posso selezionare una bitmap GDI + in un hDC? Mi piacerebbe davvero sapere se è possibile. – jnm2

risposta

6

Dopo aver cercato per giorni, improvvisamente mi ha colpito che la risposta mi stava fissando in faccia tutto il tempo! Stavo creando un bitmap GDI + da un puntatore a un array di byte. Quindi prova a creare un HBITMAP usando lo stesso puntatore. Ma ho potuto facilmente creare l'HBITMAP e usare il puntatore da esso per creare la bitmap GDI +.

Funziona come un fascino! Puoi combinare operazioni GDI e GDI + come preferisci. L'immagine è sia semplice GDI che GDI + contemporaneamente. Invece di usare DrawImage, puoi usare BitBlt dagli stessi identici dati dei pixel!

Ecco il codice:

// 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);