如何加载PNG并导出到TGA,使alpha保持在C#?
我正在编写一个工具来自动化我们为游戏制作的一些资产。我想做的是获取一个包含PNG文件的文件夹,将它们组合成一个纹理图集,然后将图集导出为TGA,并将UV坐标导出为XML 我不确定应该使用哪种方法在C#中加载PNG文件,因为似乎有几种方法。建议用什么方法在C#中加载图像,以便访问颜色/alpha数据,以便将其提取到TGA <>我也已经有了C++中的TGA创建代码,我计划搬到C,但我想知道在.NET中是否有任何东西可以创建/保存TGAs?< /P>如何加载PNG并导出到TGA,使alpha保持在C#?,c#,.net,png,alpha,tga,C#,.net,Png,Alpha,Tga,我正在编写一个工具来自动化我们为游戏制作的一些资产。我想做的是获取一个包含PNG文件的文件夹,将它们组合成一个纹理图集,然后将图集导出为TGA,并将UV坐标导出为XML 我不确定应该使用哪种方法在C#中加载PNG文件,因为似乎有几种方法。建议用什么方法在C#中加载图像,以便访问颜色/alpha数据,以便将其提取到TGA 我也已经有了C++中的TGA创建代码,我计划搬到C,但我想知道在.NET中是否有任何东西可以创建/保存TGAs?< /P> 谢谢阅读。我没有代码示例,但我可以给你一个指南 使用I
谢谢阅读。我没有代码示例,但我可以给你一个指南
哦,在我忘记之前,.NET不使用RGBA,而是使用BGRA像素。不要问我为什么,但它是这样的。将PNG文件加载到.Net位图很容易:
Bitmap bmp = (Bitmap)Bitmap.FromFile("c:\wherever\whatever.png");
// yes, the (Bitmap) cast is necessary. Don't ask me why.
加载位图后,可以使用位图的LockBits方法(StackOverflow上有许多LockBits代码示例)最有效地访问其所有信息(包括alpha通道信息)
更新:下面是一个代码示例,演示如何使用锁位逐像素访问位图的数据:
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);
System.Drawing.Imaging.BitmapData数据=
锁位(新矩形(0,0,bmp.Width,bmp.Height),
System.Drawing.Imaging.ImageLockMode.ReadOnly,bmp.PixelFormat);
不安全的
{
//重要信息:使用BitmapData对象的宽度和高度
//属性而不是位图的属性。
对于(int x=0;x
您需要为项目设置“允许不安全代码”编译器选项才能使用此代码。您也可以使用位图的GetPixel(x,y)方法,但速度惊人地慢。强制转换是必要的,因为Bitmap.FromFile实际上不存在——它调用基类“static method Image.FromFile”。@bobbymcr:当然,但为什么位图不重写FromFile,调用base.FromFile并将返回的图像转换为位图?这是有史以来最有价值的答案!!谢谢,@AndrewKeith