- - PR -
tga画像ファイルをPictureBoxに表示するには
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-05-30 13:15
VisualC#.netで開発を行っています。
tga形式の画像ファイルを読み込んで、PictureBoxに表示したいのですが Bitmapとしてロードしようとエラーがでてしまいます。 tgaの画像を表示するにはどのようにすればよいのでしょうか。 よろしくお願いいたします。 [ メッセージ編集済み 編集者: ドンキ 編集日時 2005-05-30 13:33 ] |
|
投稿日時: 2005-05-30 14:06
こんにちは。
TGA形式の画像フォーマットは、.NET標準(GDI+)では対応していないようなので、別途コーデックを用意する必要があるかと思います。 (TGAが扱える.NET用のライブラリが無いかちょっと探してみたけど、見つからなかった。。) |
|
投稿日時: 2005-05-30 14:16
これなんか対応してるっぽいですね。
http://www.grapecity.com/japan/support/database/P7_304.htm |
|
投稿日時: 2005-05-30 14:47
返答ありがとうございます。
標準だと無理なんですね。 残念ながらパッケージの購入は難しいです。 やりたいこととしては、DirectXで使用しているテクスチャの一覧を リストにして、フォーム上のピクチャボックスに表示したいのです。 DirectXですでにtgaファイルからTextureが作成されているので ここから変換してBitmapなりImageが作れればいいのですが その方法も分かりませんでした。 TextureからBitmapを取得できますでしょうか。 |
|
投稿日時: 2005-05-30 22:54
ぱっと思いついたのは
・TextureLoaderでFileにいったん落とす ・Textureからピクセル読み取ってがりがり とかですか。 …でもTextureがあるならPictureBoxなんか使わないで素直にDirectXで描いたほうがいいのでは…?というか、そのTextureのデバイスはどのWindowハンドルで作ってます? 何か不明な点が多いのでもう少し詳しくお願いできますか。 |
|
投稿日時: 2005-05-31 07:42
DirectXの話題から、はずれてしまいますが・・・。
TGAのフォーマットによりますが、 32bitRGBA形式(非圧縮)のみであると仮定できるなら、 自分でデコーダ書いた方が早いかもしれません。 フォーマットとしてはすごく単純なので。 [ メッセージ編集済み 編集者: sia 編集日時 2005-05-31 07:43 ] |
|
投稿日時: 2005-05-31 13:07
開発用ツールとして作っていて、素材の管理等が、フォームでの一覧表示やリンク等が簡単なので
フォームメインで作成しています。 まわりくどいような感じもしますが、 サーフェイスからHDCを取得してBitBltでコピーという方法でできました。 using System.Runtime.InteropServices; // Win32API用 〜〜〜〜〜〜〜〜〜〜 [DllImport("gdi32.dll", ExactSpelling=true, SetLastError=true)] private static extern int BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); private const int SRCCOPY = 0xCC0020; [DllImport("User32.dll", CharSet=CharSet.Unicode, SetLastError=true)] public static extern IntPtr FindWindowExW(IntPtr hwndParent, IntPtr hwndChildAfter, string strClassName, string strWindowName); 〜〜〜〜〜〜〜〜〜〜 Bitmap bitmap = null; // ビットマップ String pass = null; // フルパス名 ImageInformation image_info; // イメージ情報 Texture texture_tmp = null; // サーフェイス作成用テクスチャ Surface surface = null; // サーフェイス Graphics g_src, g_dest; // HDC取得用Graphics IntPtr hdc_src, hdc_dest; // HDC pass = "***.***"; image_info = TextureLoader.ImageInformationFromFile( pass ); // サーフェイス取得用テクスチャをロード texture_tmp = TextureLoader.FromFile( Form_Main.IF.device, // デバイス pass, // ファイルパス image_info.Width, // 横幅 image_info.Height, // 縦幅 0, // ミップマップレベル Usage.None, Format.R8G8B8, // 画像フォーマット Pool.Managed, // メモリクラス Filter.None, // 画像フィルター Filter.None, // ミップマップフィルター 0 // カラーキー ); // Graphicsを取得 surface = texture_tmp.GetSurfaceLevel(0); g_src = surface.GetGraphics(); bitmap = new Bitmap( image_info.Width, image_info.Height ); g_dest = Graphics.FromImage( bitmap ); // HDCを取得 hdc_src = g_src.GetHdc(); hdc_dest = g_dest.GetHdc(); // 画像コピー BitBlt( hdc_dest, 0, 0, image_info.Width, image_info.Height, hdc_src, 0, 0, SRCCOPY ); // 開放 g_src.ReleaseHdc( hdc_src ); g_dest.ReleaseHdc( hdc_dest ); g_src.Dispose(); g_dest.Dispose(); texture_tmp.Dispose(); surface.Dispose(); 〜〜〜〜〜〜〜〜〜〜 DirectX領域に表示用のテクスチャを普通に texture = TextureLoader.FromFile( device, pass ); と取っているのですが、これがアルファ付きのファイルだった場合に surface = texture.GetSurfaceLevel(0); g_src = surface.GetGraphics(); のGetGraphics()で失敗してしまうため、仕方なくRGB用のテクスチャをもう一枚ロードしてしまいました。 テクスチャをロックしてビットマップ領域にコピーという方法も試しましたが ピクセルコピーでやってしまったので遅かったためやめました。 領域まるごとコピーできれば速いのかもしれません。 スピード的には今のところ問題ないのと、ファイルフォーマットの部分をDirectXが吸収してくれるので とりあえずこれで進めて、ひと段落したらもう一度考えてみたいと思います。 |
1