6

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

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

我也已经有 C++ 中的 TGA 创建代码,我计划转移到 C#,但我想知道 .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 方法最有效地访问其所有信息(包括 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) 方法,但这非常慢。

于 2009-10-03T21:22:43.357 回答
1

我没有代码示例,但我可以给你一个指导

  1. 使用 Image.FromFile() 加载 PNG。.NET 支持加载 PNG
  2. 打开 targa 的文件句柄。创建一个 XmlDocument。.NET 不支持 targa,所以你必须手动编写它。
  3. 锁定位图以获取像素。GetPixel() 非常慢。我认为该方法名为 LockBits()。你得到一个指向表面的指针来读取像素
  4. 写信给塔尔加。Targa 是一种容器格式,因此任何位图都应该适合。
  5. 将 UV 保存为 Xml。

Targa 格式

你想使用调色板吗?由于您制作游戏,我建议您为位图计算调色板并将其放入 targa 以减小文件大小。

哦,在我忘记之前,.NET 不使用 RGBA,而是像素是 BGRA。不要问我为什么,但就是这样。

于 2009-10-03T21:21:24.793 回答