そんなわけでですね。
MDXで読み込んだらすべからくMicrosoft.DirectX.Direct3D.Textureになるわけですよ。
Formあぷりけーそんなので、これを描画するには一工夫必要する必要があるわけですよ。
HDC経由でBitbltが出来るよ!(・∀・)
っていう@ITで投稿をみたので、やってみようかなぁと思ったのですが、ヘルプを眺めてたらOnPaintのPaintEventArgs.GraphicsにDrawImageすればいいんじゃね? と思いまして、Textureをこねくりまわして、System.Drawing.Imageにすればいいのねーというわけで、またまたヘルプを眺めてたら、Texture側の出来ることは非常に少ないようで、Graphicsのプロパティ経由でなんかするか、HDCとるかなんか手法が限られてきます。
なんかもっと違う手法ないかのーとあれこれ見てたら、LockRectangleすればGraphicsStreamを返してくることを発見。
中身を見てみたら、Streamが親クラス。
これは! とおもって、System.Drawing.Bitmapのコンストラクタを見たらStreamを引数なのがあるので、それをやってみるかってことで、やってみたんですよ。
GraphicsStream stream = Texture.LockRectangle();
なんて書いて、streamはきちんと帰ってくるんだけど、それをBitmapのコンストラクタに食わせると、引数不正です。ぺっと例外を吐いてくれるわけです。
なんだとー! と思って、streamの中身を見てみたら、なんかサイズが0x7fffffffなんて数字です。
明らかにおかしくて、LockRectangleの引数を変えてみても一緒。
しょうがないからTextureからSurfaceを引っ張り出して、LockRectangleをしても一緒。
えーえーえー(´Д`)
と悩んだあげくに、MHFをやって一休憩。
むーん。
キリン変種にハットトリックを決めそうになったりもしましたが、まぁ、それはおいといてですね。
終わって、改めて考え直してみて、これはLockRectangleがおかしいということにして、違う方法を模索することにします。
TextureLoader.LoadFromFileでTextureを読み込んでいるわけでして、そいつの引数になんかないだろうかとヘルプをみてみたら、SaveToStreamなんてメソッドを発見。
Loaderなのに! とか思ったのはナイショですが、まぁ、これを試してみることに。
GraphicsStream stream = TextureLoader.SaveToStream( ImageFileFormat.Bmp, image_info.TextureImage );
Bitmap bitmap = new Bitmap( stream );
e.Graphics.DrawImage( bitmap, new Point( 0, 0) );
こんな感じでやってみたら動きました。
きちんとでるじゃーん。
なんというか、こんなくだらんことに、どんだけ無駄な時間かけたとおもってるんだよ(´Д`)
あーでもαがどうなってるかみてないな。
みないとー。
しかし、ぐぐってもLockRectangleってでてこないってことは、みんな使ってないって事ですかw
私もSurfaceからBitmapを作りたく、しかしWin APIは呼び出したくないと思いながら
いろいろ検索していてここに辿りつきました。
Stream経由でのBitmap作成方法、大変参考になりました。ありがとうございます。
LockRecangleが失敗するのは、おそらく下記に書いてあることが原因ではないかと思います。
http://msdn.microsoft.com/en-us/library/bb153341(VS.85).aspx
Textureの場合はdynamicまたはCreateOffscreenPlainSurfaceで作られたものでなければならない
Surfaceの場合はLockableBackBufferとして作られたものでなければならない
このへんはC++の時に色々と調べてLockして色々とやってるんで、その手の類の事は間違えないと思うんですがねぇ…。
あんまり時間もかけたくなかったんで、↑みたいな感じでさっとやめましたけど、なんか勘違いがあったにちがいないとは思ってますw