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?
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
@ 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". –
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