我正在编写一个工具来自动化我们为游戏制作的一些资产。我想要做的是获取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) 方法,但这非常慢。
我没有代码示例,但我可以给你一个指导
你想使用调色板吗?由于您制作游戏,我建议您为位图计算调色板并将其放入 targa 以减小文件大小。
哦,在我忘记之前,.NET 不使用 RGBA,而是像素是 BGRA。不要问我为什么,但就是这样。