2016-12-07 59 views
1

Mapbox提供了Global elevation data與在PNG圖像中編碼的高度數據。身高由height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1)解碼。詳情請見https://www.mapbox.com/blog/terrain-rgb/如何獲得`PNG`圖像的正確`RGB`值?

我想導入高度數據以生成地形Unity3D

Texture2D dem = (Texture2D)AssetDatabase.LoadAssetAtPath("Assets/dem/12/12_3417_1536.png", typeof(Texture2D)); 
    for (int i = 0; i < width; i++) 
     for (int j = 0; j < height; j++) 
     { 
      Color c = dem.GetPixel(i, j); 

      float R = c.r*255; 
      float G = c.g*255; 
      float B = c.b*255; 
      array[i, j] = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1f); 
     } 

在這裏,我設置一個斷點和第一像素的rgba值爲RGBA(0.000, 0.592, 0.718, 1.000)c.r0。高度不正確,因爲這一點代表山上某處的高度。

然後我打開圖片Photoshop並得到RGB的第一個像素:R=1,G=152,B=179

我在C#寫了一個測試程序。

System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap("12_3417_1536.png"); 
Color a = bitmap.GetPixel(0, 0); 

這表明Color a(R,G,B,A)=(1,147,249,255)

這裏是我的形象進行測試: https://api.mapbox.com/v4/mapbox.terrain-rgb/12/3417/1536.pngraw?access_token=pk.eyJ1Ijoib2xlb3RpZ2VyIiwiYSI6ImZ2cllZQ3cifQ.2yDE9wUcfO_BLiinccfOKg

爲什麼我得到不同的RGBA值不同的方法?哪一個是正確的? 根據以下評論,不同讀取順序和壓縮數據的統一可能會導致像素(0,0)rgba的不同值。

現在我想專注於----如何將rgba(0~1)轉換爲RGBA(0~255)r_ps=r_unity*255?但是我怎樣才能解釋r=0在統一和r=1 PS的像素在(0,0)

回答

0

我會假設您使用的是同一張照片,並且在單獨的文件夾中沒有兩個12_3417_1536.png文件。

這些功能中的每一個都有不同的概念,其中像素爲(0,0)。當您使用photoshop進行測試時,不確定「第一個」像素是什麼意思,但統一的紋理座標從左下角開始。

當我使用paint測試左下角的像素時,我得到了與photoshop相同的值。但是,如果您測試上部左上角,則會得到(1,147,249,255),這是bitmap.GetPixel返回的結果。

你所得到的統一價值似乎沒有了。嘗試撥打dem.GetPixel(0,0),以確保您正在分析最簡單的情況。

+0

如何將單位(範圍0〜1)中的'rgba'值轉換爲PS中的相似值(範圍0〜255)?重點在於,在'(0,0)'處像素的單位'r'的值是'0'。但是在PS中,r的值是'1'。如果我用'r_PS = r_unity * 255'轉換這個值,結果似乎是無法匹配的。 – oleotiger

+0

我同意,結果似乎完全無法匹敵。你應該能夠像你所做的那樣乘以255,但除非有一些四捨五入的情況發生,否則它不應該是0.真正令人擔憂的是B值。 '.718 * 256 = 183'這是超過179.這可能是壓縮,大衛指出,或者你可以比較不同的像素。 – code11

+0

我設置了統一的紋理導入設置(truecolor,uncompressed,maxSize = 8192),像素'(0,0)'的'gbra'爲''RGBA(0.004,0.596,0.702,1.000)「'。這似乎工作。那麼,應該有一個類型轉換? 'r_PS = Math.Round(r_unity * 255)'? – oleotiger

1

嘗試在Unity中禁用壓縮紋理的導入設置(無壓縮)。或者,如果您在運行時獲取數據,則可以使用Texture.LoadBytes()來避免壓縮失真。

+0

這是我錯過的一點。這真的很重要!謝謝! – oleotiger

相關問題