GDI+ビットマップに直接bitbltを使用することは可能ですか?
質問
HBITMAPからGDI+ BitMapにBitBltを試みています。私はこれを試しましたが、何も起こりません:
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);
編集: どうやらHDCはそれを取得しても機能しないようにし、その後はずっと後でBitbltで使用します。 HDCがまだ有効であることを確認する必要がありました。これが解決策です:
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);
この変更が必要な理由を誰かが知っていますか?最初の例のように早めに得られたHDCを使用するのがうまくいかないのはなぜですか?
解決
これの最後にサンプルを確認してください ページ Pinvoke.netで。 CreateCompatibledCとSelectObjectへの追加の呼び出しにより、サンプルが機能する可能性があります。
または、Graphics.drawimageunscalledの使用を検討することもできます。これにより、.NET側にのみコードを実装でき、非常に優れたパフォーマンスを提供できます。
アップデート (更新された質問のため)
HDCがしばらくして無効になる理由は正確にはわかりませんが、 MSDN gethdcとreleasehdcをペアでリリースし、それらの間のGDI+コードへの呼び出しをグループ化します。 「
したがって、ドキュメントによると、2番目のサンプルで行った方法は進む方法であり、GETHDCメソッドから値をキャッシュして再利用しないでください。
所属していません StackOverflow