2017-09-02 81 views
2

为什么在我加载外部的时候使用Unity RGBA32 .png(通过PaintXP或Gimp保存)在中间有一个(64,64,64)像素的斑点时Debug.Log行在底部返回不正确的值? - 我能得到的最接近的是一个未压缩的.png(来自Gimp),具有像(65,66,65)这样的值,但是具有标准图像,他们似乎回到了(56,56,56)。Unity Texture2D loadImage确切的值

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.当你在你的Texture2D上调用Compress它会压缩你的纹理。 bool参数只会告诉它做低质量或高质量的压缩。因此,只需删除该行:tex.Compress(false);

2. PNG具有gamma信息。 Gimp有一个选项,当你导出到PNG保存伽马或不。因此,在Gimp中打开你的图像,并取消选中“保存Gamma”选项后导出它。

或者我可以通过从TweakPNG中删除png的gAMAsRGB属性来获得相同的结果。

+0

虽然这个工作,我仍然困惑,为什么当一个图像保存在油漆(只是从WindowsXP的旧版本)将显示值(64,64,64)在颜色选择器中打开时在瘸子,但仍然当通过我的原始代码片段完成基本相同的过程时,返回(56,56,56)。 – Rogod

+0

这两个PNG(gimp和paint)包含相同的图像信息,除了在paint中保存的图像信息有'gAMA'块,它基本上是这样说的:“当你显示我做这个'校正''。网上有几篇关于这方面的文章可以比我更好地解释它。只需搜索谷歌“PNG伽玛校正”。 – Pluto