TextureとかSurfaceのLockRectangle

そんなわけでですね。
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

  1. 私もSurfaceからBitmapを作りたく、しかしWin APIは呼び出したくないと思いながら
    いろいろ検索していてここに辿りつきました。
    Stream経由でのBitmap作成方法、大変参考になりました。ありがとうございます。

    LockRecangleが失敗するのは、おそらく下記に書いてあることが原因ではないかと思います。
    http://msdn.microsoft.com/en-us/library/bb153341(VS.85).aspx
    Textureの場合はdynamicまたはCreateOffscreenPlainSurfaceで作られたものでなければならない
    Surfaceの場合はLockableBackBufferとして作られたものでなければならない

  2. このへんはC++の時に色々と調べてLockして色々とやってるんで、その手の類の事は間違えないと思うんですがねぇ…。
    あんまり時間もかけたくなかったんで、↑みたいな感じでさっとやめましたけど、なんか勘違いがあったにちがいないとは思ってますw

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>