簡體   English   中英

如何在C#中加載PNG並導出到TGA保持alpha?

[英]How to load PNGs and export to TGA keeping alpha in C#?

我正在編寫一個工具來自動化我們為游戲制作的一些資產。 我想要做的是獲取PNG文件的文件夾,將它們組合成紋理圖集,然后將圖集導出為TGA,將UV坐標導出為XML。

我不確定我應該使用哪種方法在C#中加載PNG文件,因為似乎有幾種。 在C#中加載圖像的推薦方法是什么,可以訪問顏色/ alpha數據,以便將其提取到TGA?

我也已經在C ++中創建了TGA創建代碼,我打算轉到C#,但我想知道.Net中是否有任何可用於創建/保存TGA的東西?

謝謝閱讀。

將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方法最有效地訪問其所有信息(包括Alpha通道信息)(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)方法,但這非常慢。

我沒有代碼示例,但我可以為您提供指導

  1. 使用Image.FromFile()加載PNG。 .NET支持加載PNG
  2. 打開targa的文件句柄。 創建一個XmlDocument。 .NET不支持targa,因此您必須手動編寫它。
  3. 鎖定位圖以獲得像素。 GetPixel()非常慢。 我認為該方法名為LockBits()。 你得到一個指向表面的指針來讀取像素
  4. 寫給targa。 Targa是一種容器格式,因此任何位圖都應該適合。
  5. 將UV保存為Xml。

Targa格式

你想用調色板嗎? 從你制作游戲開始,我建議你為你的位圖計算一個調色板,然后把它放到targa中以減小文件大小。

哦,在我忘記之前,.NET不使用RGBA,相反,像素是BGRA。 不要問我為什么,但就像那樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM