6

ゲーム用のアセット作成の一部を自動化するツールを作成しています。私がやりたいのは、PNG ファイルのフォルダーを取得し、それらをテクスチャ アトラスに結合してから、アトラスを TGA としてエクスポートし、UV 座標を XML にエクスポートすることです。

いくつかあるように見えるため、C#でPNGファイルをロードするためにどの方法を使用する必要があるかわかりません。TGA に抽出できるように、カラー/アルファ データにアクセスできる C# で画像をロードするための推奨される方法は何ですか?

また、C# に移行する予定の C++ で TGA 作成コードを既に持っていますが、.Net で TGA を作成/保存するために既に利用できるものがあるかどうか疑問に思っていますか?

読んでくれてありがとう。

4

2 に答える 2

8

PNG ファイルを .Net ビットマップにロードするのは簡単です。

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

Bitmap をロードしたら、Bitmap の 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);

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

于 2009-10-03T21:22:43.357 に答える
1

コードサンプルはありませんが、ガイドラインを提供できます

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

タルガフォーマット

パレットを使用しますか? ゲームを作成しているので、ビットマップのパレットを計算し、それを targa に入れてファイル サイズを縮小することをお勧めします。

ああ、忘れる前に、.NET は RGBA を使用しません。代わりに、ピクセルは BGRA です。理由は聞かないでください。

于 2009-10-03T21:21:24.793 に答える