2009-10-03 48 views
6

私は、ゲームの資産を自動化するためのツールを書いています。私がしたいのは、PNGファイルのフォルダを取り出し、それらをテクスチャアトラスに結合し、アトラスをTGAとしてエクスポートし、UV座標をXMLにエクスポートすることです。C#でPNGを読み込んでアルファをTGAに書き出す方法は?

C#でPNGファイルを読み込むためにどのメソッドを使うべきかわからないので、いくつかあるようです。カラー/アルファデータにアクセスできるようにC#でイメージをロードするために推奨される方法は何ですか?TGAに抽出することはできますか?

私はすでにTigerの作成コードをC++に持っていますが、私はC#に移行する予定ですが、TGAを作成/保存するために既に.Netに利用可能なものがあれば疑問です。

読んでいただきありがとうございます。

答えて

8

は簡単です:

Bitmap bmp = (Bitmap)Bitmap.FromFile("c:\wherever\whatever.png"); 
// yes, the (Bitmap) cast is necessary. Don't ask me why. 

あなたはビットマップロードしたら、あなたはビットマップのするLockBitsメソッドを使用して最も効率的に(アルファチャンネル情報を含む)の情報のすべてにアクセスすることができます(StackOverflowには多くのLockBitsコードサンプルがあります)。

更新は:ここではビットマップのデータピクセルごとにアクセスするためにするLockBitsを使用する方法を示したコードサンプルがあります:

System.Drawing.Imaging.BitmapData data = 
    bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), 
    System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat); 
unsafe 
{ 
    // important to use the BitmapData object's Width and Height 
    // properties instead of the Bitmap's. 
    for (int x = 0; x < data.Width; x++) 
    { 
     int columnOffset = x * 4; 
     for (int y = 0; y < data.Height; y++) 
     { 
      byte* row = (byte*)data.Scan0 + (y * data.Stride); 
      byte B = row[columnOffset]; 
      byte G = row[columnOffset + 1]; 
      byte R = row[columnOffset + 2]; 
      byte alpha = row[columnOffset + 3]; 
     } 
    } 
} 
bmp.UnlockBits(data); 

あなたはあなたのための「許可安全でないコード」コンパイラオプションを設定する必要がありますこのコードを使用するプロジェクト。また、ビットマップのGetPixel(x、y)メソッドを使用することもできますが、これは驚くほど遅いです。

+0

Bitmap.FromFileが実際に存在しないため、キャストが必要です。これは、ベースクラスの静的メソッドImage.FromFileを呼び出しています。 – bobbymcr

+0

@bobbymcr:確かに、BitmapはFromFileをオーバーライドしないので、base.FromFileを呼び出し、返されたImageをビットマップとしてキャストしますか? – MusiGenesis

0

私は、コードサンプルを持っていけない、しかし私はあなたにImage.FromFile()を使用してガイドライン

  1. ロードPNGを与えることができます。 .NETでのPNGのロードがサポートされています
  2. targaへのファイルハンドルを開きます。 XmlDocumentを作成します。 .NETはtargaをサポートしないため、手動で書き込む必要があります。
  3. ビットマップをロックしてピクセルを取得します。 GetPixel()は非常に遅いです。私はこのメソッドの名前がLockBits()だと思います。ピクセルを読み取るためのサーフェスへのポインタを取得する
  4. targaに書き込む。 Targaはコンテナ形式なので、任意のビットマップに収まる必要があります。
  5. UVをXmlとして保存します。

Targa format

あなたはパレットを使用しますか?あなたのゲームを作ってから、あなたのビットマップ用のパレットを計算し、ファイルサイズを減らすためにそれをtargaに入れることをお勧めします。

ああ、忘れる前に、.NETはRGBAを使用せず、代わりにピクセルはBGRAです。なぜ私に聞かないでくださいが、そのように。純ビットマップへのPNGファイルをロード

関連する問題