2007.06.20

ふと思い立って DirectXを使ってみている

今回はちょっとマニアック。


DirectXで表示したイメージを画像データとして取り出そうとして散々悩んだのだが、
どうも表示に使ったコンポーネント(例えば picturebox)から保存(.Image.Save)したり
_Paint イベントで Graphicsを横取りしたりしても画像データは取り出せない
らしいことがわかってきた。

どうも、DirectX にまでさかのぼって取り出す必要があるらしい。

例えばファイルとして保存したければ以下のようにする。

Imports Microsoft.DirectX.Direct3D
 SurfaceLoader.Save("c:\hoge.png", ImageFileFormat.Png, _device.GetBackBuffer(0, 0, BackBufferType.Mono))

イメージを byte配列で取り出したい場合は、例えば以下のようにする。

Dim strm As GraphicsStream = SurfaceLoader.SaveToStream(ImageFileFormat.Png, _device.GetBackBuffer(0, 0, BackBufferType.Mono))
Dim bufstrm As BufferedStream = New BufferedStream(strm, strm.Length)
Dim buff As Byte() = New Byte(strm.Length) {}
bufstrm.Read(buff, 0, buf.Length)

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ichikawa