Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何加载PNG并导出到TGA,使alpha保持在C#?_C#_.net_Png_Alpha_Tga - Fatal编程技术网

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

如何加载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

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

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

<>我也已经有了C++中的TGA创建代码,我计划搬到C,但我想知道在.NET中是否有任何东西可以创建/保存TGAs?< /P>
谢谢阅读。

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

  • 使用Image.FromFile()加载PNG。NET支持加载PNG
  • 打开targa的文件句柄。创建一个XmlDocument。NET不支持targa,因此您必须手动编写它
  • 锁定位图以获取像素。GetPixel()非常慢。我认为该方法名为LockBits()。您将获得指向曲面的指针以读取像素
  • 写信给塔尔加。Targa是一种容器格式,因此任何位图都应该适合
  • 将UV另存为Xml
  • 您想使用调色板吗?由于您正在制作一个游戏,我建议您为位图计算一个调色板,并将其放入targa以减小文件大小


    哦,在我忘记之前,.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