2011-01-01 12 views
0

私はHBITMAPからGDI +ビットマップにBitBltをしようとしています。私はこれを試してみましたが、何も起こりません:BitBltを直接GDI +ビットマップに送ることは可能ですか?

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); 

編集:私はそれを取得してからずっと後のBitBltでそれを使用する場合どうやらたhDCは動作しません。 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を使用するのがなぜうまくいかないのでしょうか?

答えて

0

pinvoke.netのpageの最後にあるサンプルを確認してください。 CreateCompatibleDCとSelectObjectをさらに呼び出すと、サンプルが機能する可能性があります。

また、Graphics.DrawImageUnscalledを使用すると、.Net側でのみコードを実装できるようになり、かなり良いパフォーマンスが得られます。

(原因更新の質問に)

更新
たhDCは、しばらく後に無効になる理由を正確に私は知らないが、MSDNによると、あなたはそれらの間のGDI +のコードの呼び出しペアやグループでGetHdcとReleaseHdcを呼び出します: "GetHdcメソッドとReleaseHdcメソッドの呼び出しは対で表示されなければなりません。GetHdcとReleaseHdcメソッドのペアの範囲では、通常、GDI関数を呼び出すだけです。

ドキュメントによれば、2番目のサンプルで行ったやり方があります。GetHdcメソッドの値をキャッシュして再利用しないでください。

+0

私はこの問題を発見したかもしれないと思っていますが、私はまだそれに取り組んでいます。 DrawImageUnscaledは高速ではありません。実際にはDrawImageを呼び出します。あなたは不平等な人であなた自身のために見ることができます。 – jnm2

+0

@ jnm2、あなたが正しいです、DrawImageUnscalledはDrawImageを呼び出しますが、オーバーロードよりはるかに高速な画像のサイズ変更を行わないオーバーロードバージョンを呼び出します。また、私はDrawImageUnscalledがBitBltより速いとは言わなかった、私はそれが "かなりよい性能を提供する"と言った。 –

+0

私が必要とする情報はHBITMAPにあり、変更できませんので、FromHBitmapまたはBitBlt(高速)を使用してGDI +に取得する必要があります。それから私は、双線形のストレッチでイメージを描くことを計画しています。しかし、DrawImageについてはわかりませんでした。それは役に立つでしょう。知らせてくれてありがとうございます! – jnm2

関連する問題