Frage

Ist es möglich, Bitblt direkt aus einem GDI+ Bitmap zu kopieren, ohne Gethbitmap zu verwenden?

Gethbitmap ist langsam, da es zusätzlich zu einer neuen Kopie des gesamten Bildes und langsamer ist als die Bitblt -Kopie, und die angegebene Hbitmap muss entsorgt werden. Das Bild ist groß.

Gibt es eine Möglichkeit, Bitblt zu zeigen, um die Pixeldaten des ursprünglichen GDI+ -Abbilds zu verwenden?

BEARBEITEN: Ich kann einen Zeiger auf die GDI+ Bitmap -Pixeldaten im Speicher bringen. Kann ich eine HBitmap erstellen, die auf die GDI+ Bitmap -Pixeldaten verweist, um die zusätzliche Kopie zu vermeiden, und das Bitblt daraus?

War es hilfreich?

Lösung

Nachdem ich tagelang gesucht hatte, traf es mich plötzlich, dass die Antwort mir die ganze Zeit ins Gesicht starrte! Ich habe eine GDI+ Bitmap von einem Zeiger auf ein Byte -Array erstellt. Versuchen Sie dann, mit demselben Zeiger eine hbitmap zu erstellen. Aber ich könnte zuerst genauso einfach die Hbitmap erstellen und den Zeiger davon verwenden, um die GDI+ Bitmap zu erstellen.

Es wirkt wie ein Zauber! Sie können GDI- und GDI+ -Operationen mischen, wie Sie möchten. Das Bild ist sowohl einfach GDI als auch GDI+ gleichzeitig. Anstatt Drawimage zu verwenden, können Sie genau die gleichen Pixeldaten aus bitblt!

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top