【问题标题】:How to load PNGs and export to TGA keeping alpha in C#?如何加载 PNG 并导出到 TGA,在 C# 中保持 alpha?
【发布时间】:2010-12-03 15:28:42
【问题描述】:

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

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

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

感谢阅读。

【问题讨论】:

    标签: c# .net png alpha tga


    【解决方案1】:

    将 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) 方法,但这非常慢。

    【讨论】:

    • 强制转换是必要的,因为 Bitmap.FromFile 实际上并不存在——它正在调用基类的静态方法 Image.FromFile。
    • @bobbymcr: 当然可以,但是为什么 Bitmap 不覆盖 FromFile,调用 base.FromFile 并将返回的 Image 转换为 Bitmap?
    【解决方案2】:

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

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

    Targa format

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

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

    【讨论】:

    • 有史以来最有价值的答案!!谢谢,@AndrewKeith
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2011-08-02
    • 2012-08-29
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多