PNGSをロードしてTGAにエクスポートする方法C#でアルファを維持する方法は?

StackOverflow https://stackoverflow.com/questions/1514846

  •  19-09-2019
  •  | 
  •  

質問

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

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

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

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

役に立ちましたか?

解決

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

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

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

アップデート: :これは、ロックビットを使用してビットマップのデータピクセルごとにアクセスする方法を示すコードサンプルです。

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)メソッドを使用することもできますが、これは驚くほど遅いです。

他のヒント

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

  1. image.fromFile()を使用してPNGをロードします。 .NETはPNGの読み込みをサポートしています
  2. Targaにファイルハンドルを開きます。 xmldocumentを作成します。 .NETはTargaをサポートしていないため、手動で書く必要があります。
  3. ビットマップをロックして、ピクセルで取得します。 getPixel()は非常に遅いです。この方法はLockbits()という名前の名前だと思います。あなたはピクセルを読むために表面へのポインターを取得します
  4. タルガに書いてください。 Targaはコンテナ形式なので、ビットマップは適合する必要があります。
  5. UVをXMLとして保存します。

タルガ形式

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top