今回はちょっとマニアック。
DirectXで表示したイメージを画像データとして取り出そうとして散々悩んだのだが、
どうも表示に使ったコンポーネント(例えば picturebox)から保存(.Image.Save)したり
_Paint イベントで Graphicsを横取りしたりしても画像データは取り出せない
らしいことがわかってきた。
どうも、DirectX にまでさかのぼって取り出す必要があるらしい。
例えばファイルとして保存したければ以下のようにする。
Imports Microsoft.DirectX.Direct3D
SurfaceLoader.Save("c:\hoge.png", ImageFileFormat.Png, _device.GetBackBuffer(0, 0, BackBufferType.Mono))
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)
Dim bufstrm As BufferedStream = New BufferedStream(strm, strm.Length)
Dim buff As Byte() = New Byte(strm.Length) {}
bufstrm.Read(buff, 0, buf.Length)