GDI+ビットマップに直接bitbltを使用することは可能ですか?

StackOverflow https://stackoverflow.com/questions/4574436

  •  14-10-2019
  •  | 
  •  

質問

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メソッドから値をキャッシュして再利用しないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top