Unity Texture2D加载图像精确值

3
当我使用Unity加载一个1024x1024 RGBA32格式的外部.png图片(通过PaintXP或Gimp保存),并在中心放置一个像素块(64,64,64),为什么底部的Debug.Log行会返回不正确的值?最接近的结果是使用未压缩的.png文件(来自Gimp)并设置像(65,66,65)这样的值,但是对于标准图像,它们似乎会返回(56,56,56)。
    Texture2D tex = null;
    byte[] fileData;
    if (File.Exists(mapPath + "/map.png"))
    {
        fileData = File.ReadAllBytes(mapPath + "/map.png");
        tex = new Texture2D(size, size, TextureFormat.RGBA32, false);
        tex.anisoLevel = 0;
        tex.Compress(false);
        tex.filterMode = FilterMode.Point;
        tex.LoadImage(fileData); // Auto-resize the texture dimensions
        Color32[] pixelsRaw = tex.GetPixels32(0);
        Color32[,] pixels = new Color32[size, size];
        for (int j = 0; j < size - 1; j++)
        {
            for (int i = 0; i < size - 1; i++)
            {
                pixels[i, j] = pixelsRaw[(j * tex.height) + i];
            }
        }
        Debug.Log(pixels[512, 512]);
    }

这全部都是为了从 .png 图片中读取基于瓦片的关卡。但由于返回的值非常不准确,我似乎找不到一种使这成为可能的方法。(我用 Java.awt/LWJGL 做过很多次,那里运行得很好,为什么在 Unity 中不行呢?)需要澄清的是,这张图片是从 Unity 项目外部加载的,所以无法通过编辑器手动设置压缩/格式设置。
1个回答

1
有两个问题:压缩和γ校正。
1. 当你在 Texture2D 上调用 Compress 时,它将压缩你的贴图。bool 参数只是告诉它进行低质量或高质量压缩。因此,只需删除该行:tex.Compress(false);
2. PNG 具有伽马信息。当你在 Gimp 中导出 png 时,它有一个选项来保存 gamma 或不保存。所以在 Gimp 中打开图像,并使用“保存 Gamma”选项未选中导出它。
或者,我能通过从 png 中删除 gAMA 和sRGB 属性来获得相同的结果,使用 TweakPNG

虽然这个方法可以工作,但我仍然困惑为什么在Paint中保存的图像(只是WindowsXP中的旧版本)在Gimp中打开时,在颜色选择器中会显示(64,64,64)的值,但当通过我的原始代码片段进行基本相同的处理时,仍然返回(56,56,56)。 - Rogod
这两个PNG文件(gimp和paint)包含相同的图像信息,除了在paint中保存的一个带有“gAMA”块的图像,它基本上表示“当你显示我时进行此‘校正’”。网络上有一些关于这方面的文章,可以比我更好地解释它。只需在谷歌上搜索“PNG伽马校正”即可。 - Pluto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接