2011-01-03 19 views
5

Ist es möglich, BitBlt zu verwenden, um direkt aus einer GDI + -Bitmap zu kopieren, ohne GetHBitmap zu verwenden?Ist es möglich, BitBlt direkt aus einer GDI + -Bitmap?

GetHBitmap ist langsam, weil es eine neue Kopie des gesamten Bildes erstellt, zusätzlich zu und langsamer als die BitBlt-Kopie, und die gegebene HBITMAP muss entsorgt werden. Das Bild ist groß.

Gibt es eine Möglichkeit, BitBlt auf die Pixeldaten des ursprünglichen GDI + -Bildes zu verweisen?

EDIT: Ich kann einen Zeiger auf, wo die GDI + Bitmap-Pixeldaten im Speicher ist. Kann ich einen HBITMAP erstellen, der auf die GDI + -Bitmap-Pixeldaten verweist, um die zusätzliche Kopie zu vermeiden, und BitBlt daraus?

+1

BitBlt Kopien von einem DC zu einem anderen. Um eine Bitmap auf einen Domänencontroller zu zeichnen, wählen Sie die Bitmap in den Quell-DC und dann BitBlt es auf das Ziel. Wenn Sie das mit einem GDI + 'Bitmap'-Objekt tun möchten, sollten Sie nicht' Graphics.DrawImage' verwenden, wo das 'Graphics'-Objekt den beabsichtigten Ziel-DC umschließt? Warum überhaupt eine 'HBitmap' durchlaufen? –

+1

Der Grund, warum ich BitBlt brauche, ist der Raster-Vorgang. DrawImage kann keine ODER-Operation von einem Bild zu einem anderen durchführen. Und ich habe es mit GDI-Bitmaps gemacht, aber wie kann ich eine GDI + -Bitmap in ein hDC auswählen? Ich würde wirklich gerne wissen, ob es möglich ist. – jnm2

Antwort

6

Nachdem ich tagelang gesucht hatte, fiel mir plötzlich auf, dass mir die Antwort die ganze Zeit ins Gesicht geschaut hatte! Ich habe eine GDI + -Bitmap von einem Zeiger auf ein Byte-Array erstellt. Dann versuchen Sie, einen HBITMAP mit dem gleichen Zeiger zu erstellen. Aber ich könnte genauso einfach das HBITMAP zuerst erstellen und den Zeiger von dem verwenden, um das GDI + -Bitmap zu erstellen.

Es funktioniert wie ein Charme! Sie können GDI- und GDI + -Operationen mischen, wie Sie möchten. Das Bild ist sowohl normale GDI und GDI + auf einmal. Anstatt DrawImage zu verwenden, können Sie BitBlt aus genau den gleichen Pixeldaten erstellen!

Hier ist der 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); 
Verwandte Themen