- PR -

tga画像ファイルをPictureBoxに表示するには

1
投稿者投稿内容
ドンキ
会議室デビュー日: 2005/05/30
投稿数: 8
投稿日時: 2005-05-30 13:15
VisualC#.netで開発を行っています。

tga形式の画像ファイルを読み込んで、PictureBoxに表示したいのですが
Bitmapとしてロードしようとエラーがでてしまいます。

tgaの画像を表示するにはどのようにすればよいのでしょうか。

よろしくお願いいたします。

[ メッセージ編集済み 編集者: ドンキ 編集日時 2005-05-30 13:33 ]
nodera
大ベテラン
会議室デビュー日: 2003/09/08
投稿数: 200
投稿日時: 2005-05-30 14:06
こんにちは。

TGA形式の画像フォーマットは、.NET標準(GDI+)では対応していないようなので、別途コーデックを用意する必要があるかと思います。
(TGAが扱える.NET用のライブラリが無いかちょっと探してみたけど、見つからなかった。。)

burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-05-30 14:16
これなんか対応してるっぽいですね。
http://www.grapecity.com/japan/support/database/P7_304.htm
ドンキ
会議室デビュー日: 2005/05/30
投稿数: 8
投稿日時: 2005-05-30 14:47
返答ありがとうございます。
標準だと無理なんですね。
残念ながらパッケージの購入は難しいです。

やりたいこととしては、DirectXで使用しているテクスチャの一覧を
リストにして、フォーム上のピクチャボックスに表示したいのです。

DirectXですでにtgaファイルからTextureが作成されているので
ここから変換してBitmapなりImageが作れればいいのですが
その方法も分かりませんでした。

TextureからBitmapを取得できますでしょうか。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2005-05-30 22:54
ぱっと思いついたのは
・TextureLoaderでFileにいったん落とす
・Textureからピクセル読み取ってがりがり
とかですか。

…でもTextureがあるならPictureBoxなんか使わないで素直にDirectXで描いたほうがいいのでは…?というか、そのTextureのデバイスはどのWindowハンドルで作ってます?

何か不明な点が多いのでもう少し詳しくお願いできますか。
sia
常連さん
会議室デビュー日: 2004/05/02
投稿数: 38
投稿日時: 2005-05-31 07:42
DirectXの話題から、はずれてしまいますが・・・。

TGAのフォーマットによりますが、
32bitRGBA形式(非圧縮)のみであると仮定できるなら、
自分でデコーダ書いた方が早いかもしれません。

フォーマットとしてはすごく単純なので。


[ メッセージ編集済み 編集者: sia 編集日時 2005-05-31 07:43 ]
ドンキ
会議室デビュー日: 2005/05/30
投稿数: 8
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)