2017-09-02 253 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