如何在C#中加载PNG并导出到TGA保持alpha?

Kat*_*ath 6 .net c# png alpha tga

我正在编写一个工具来自动化我们为游戏制作的一些资产.我想要做的是获取PNG文件的文件夹,将它们组合成纹理图集,然后将图集导出为TGA,将UV坐标导出为XML.

我不确定我应该使用哪种方法在C#中加载PNG文件,因为似乎有几种.在C#中加载图像的推荐方法是什么,可以访问颜色/ alpha数据,以便将其提取到TGA?

我也已经在C++中创建了TGA创建代码,我打算转到C#,但我想知道.Net中是否有任何可用于创建/保存TGA的东西?

谢谢阅读.

Mus*_*sis 8

将PNG文件加载到.Net位图很容易:

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

加载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);
Run Code Online (Sandbox Code Playgroud)

您需要为项目设置"允许不安全代码"编译器选项才能使用此代码.您也可以使用Bitmap的GetPixel(x,y)方法,但这非常慢.