2011-01-01 5 views
0

Ich versuche BitBlt von einem HBITMAP zu einem GDI + Bitmap. Ich versuchte dies, aber es passiert nichts:Ist es möglich, BitBlt direkt auf ein GDI + Bitmap?

Bitmap Buffer = New Bitmap(608, 392) 
Graphics BufferGraphics = Graphics.FromImage(Buffer); 
IntPtr hBufferDC = BufferGraphics.GetHdc(); 

... 

BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY); 

EDIT: Anscheinend ist der hDC funktioniert nicht, wenn ich es erwerben und dann später viel verwenden Sie es mit BitBlt. Ich musste sicherstellen, dass der hDC noch gültig war. Dies ist die Lösung:

Bitmap Buffer = New Bitmap(608, 392) 
Graphics BufferGraphics = Graphics.FromImage(Buffer); 

... 

IntPtr hBufferDC = BufferGraphics.GetHdc(); 
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY); 
BufferGraphics.ReleaseHdc(hBufferDC); 

Weiß jemand, warum diese Änderung notwendig ist? Warum könnte es nicht funktionieren, ein hDC zu verwenden, das früher wie im ersten Beispiel erhalten wurde?

Antwort

0

Überprüfen Sie das Beispiel am Ende dieser page auf pinvoke.net. Die zusätzlichen Aufrufe von CreateCompatibleDC und SelectObject führen möglicherweise dazu, dass Ihr Beispiel funktioniert.

Alternativ können Sie auch die Verwendung von Graphics.DrawImageUnscalled in Betracht ziehen, mit der Sie Ihren Code nur auf der .Net-Seite implementieren können und dennoch eine ziemlich gute Leistung bieten.

aktualisieren (Aufgrund aktualisiert Frage)
ich nicht genau wissen, warum die hDC nach einer gewissen Zeit ungültig wird, sondern nach MSDN Sie GetHdc und ReleaseHDC in Paaren und Gruppen, die Anrufe zu GDI + Code zwischen ihnen rufen : "Aufrufe an die GetHdc- und die ReleaseHdc-Methode müssen in Paaren angezeigt werden. Während des Bereichs eines GetHdc- und ReleaseHdc-Methodenpaars führen Sie normalerweise nur Aufrufe von GDI-Funktionen aus."

So, nach der Dokumentation, ist die Art, wie Sie in Ihrem zweiten Beispiel getan haben, der Weg zu gehen und Sie sollten nicht zwischenspeichern und Werte aus der GetHdc-Methode wiederverwenden.

+0

Ich denke, ich habe das Problem entdeckt, aber ich arbeite immer noch daran. DrawImageUnscaled ist nicht schneller. Es ruft eigentlich nur DrawImage an. Sie können selbst mit einem Disasesembler sehen. – jnm2

+0

@ jnm2, Sie haben Recht, DrawImageUnscalled ruft DrawImage auf, aber es ruft eine Überladungsversion auf, die keine Bildgrößenänderung durchführt, die viel schneller ist als die Überladungen, die das tun. Außerdem habe ich nicht gesagt, dass DrawImageUnscalled schneller als BitBlt ist, ich sagte, dass es "eine ziemlich gute Leistung bietet". –

+0

Die Informationen, die ich brauche, sind in einem HBITMAP und ich kann das nicht ändern, also muss ich FromHBitmap oder BitBlt (schneller) verwenden, um es in GDI + zu bekommen. Dann plane ich, das Bild mit bilinearer Dehnung zu zeichnen. Aber das wusste ich nicht über DrawImage. Das wird nützlich sein. Danke für die Information! – jnm2

Verwandte Themen