2017-09-02 18 views
2

Unityで、外部に1024x1024のRGBA32 .png(PaintXPまたはGimpのいずれかを介して保存されています)を読み込み、中心にblob(64,64,64)ピクセルを読み込むと、なぜDebug.Log行に底は不正確な値を返しますか? - 私が得ることができる最も近いのは、(Gimpから)圧縮されていない.png(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イメージからタイルベースのレベルを読み取ろうとしていました。しかし、戻り値が不正確であるため、これを可能にする方法を見つけることができないようです。明確にするために

(、なぜUnityの?私がいるjava.awt/LWJGLで倍のこの負荷をやったし、それが正常に動作します)、この画像はユニティプロジェクトの外部からロードされているので、方法はありませんエディタを使用して圧縮/書式設定を手動で設定します。

答えて

1

圧縮とガンマ補正の2つの問題があります。

CompressをTexture2Dに呼び出すと、テクスチャが圧縮されます。 boolパラメータは、低品質または高品質の圧縮を実行するように指示します。したがって、次の行を削除してください:tex.Compress(false);

PNGにはガンマ情報があります。ガンマを保存するためにpngにエクスポートするとき、Gimpにオプションがあります。それで、あなたの画像をGimpで開き、 "Save Gamma"オプションをオフにしてエクスポートします。


は、代わりに私がTweakPNGとPNGからgAMAsRGB属性を除去することによって、同じ結果を得ることができました。

+0

Gimpで開いたときにカラーピッカーで(64,64,64)に値が表示されるのはなぜですか(WindowsXPの古い画像のみ)元のスニペットで本質的に同じプロセスが実行されたときに返されます(56,56,56)。 – Rogod

+0

2つのPNG(gimpとpaint)には同じ画像情報が含まれていますが、塗料に保存されているものには、基本的に「私がこの修正をしたときに表示される」というgAMAブロックがあります。私ができるよりはるかに優れていることを説明できるウェブ上の記事がいくつかあります。ちょうどGoogleの "PNGガンマ補正"を検索します。 – Pluto