2016-12-07 2 views
1

Mapbox содержит Global elevation data с данными о высоте, закодированными в PNG изображении. Высота декодируется height = -10000 + ((R * 256 * 256 + G * 256 + B) * 0.1). Подробности указаны в https://www.mapbox.com/blog/terrain-rgb/.Как получить правильное значение «RGB» изображения «PNG»?

Я хочу импортировать данные о высоте для создания ландшафтов в 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.r - 0. Высота неверна, так как эта точка представляет собой высоту где-то на горе.

Затем я открываю изображение в 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 значения с другим методом? Какой из них правильный? Согласно приведенным ниже комментариям, разные порядки считывания и сжатые данные в единице могут приводить к различному значению rgba пикселя в (0,0).

Теперь я хочу сосредоточиться на ---- Как конвертировать 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, но координаты текстуры начинаются в левом нижнем углу.

Когда я тестировал пиксель нижнего левого угла, используя краску, я получил то же значение, что и с фотошопом. Однако, если вы проверите верхний левый угол, вы получите (1,147,249,255), что является результатом bitmap.GetPixel.

Значения единства, которые вы получаете, похоже, уходят. Попробуйте позвонить dem.GetPixel(0,0), чтобы убедиться, что вы анализируете простейший случай.

+0

Купите, как можно преобразовать значение 'rgba' в единицу (диапазон 0 ~ 1) в аналогичное значение, как в PS (диапазон 0 ~ 255)? Дело в том, что значение 'r' равно' 0' в единстве пикселя в '(0,0)'. Но в PS значение r равно '1'. Если я преобразую значение с помощью параметра 'r_PS = r_unity * 255', результат кажется несопоставимым. – oleotiger

+0

Согласен, результаты кажутся совершенно непревзойденными. Вы должны просто иметь возможность умножить на 255, как вы делаете, но если не происходит округления, это действительно не должно быть 0. Что беспокоит, действительно, значение B. '.718 * 256 = 183', что более чем 179. Это может быть сжатие, как указал Дэвид, или вы могли бы каким-то образом сравнить разные пиксели. – code11

+0

Я установил настройку текстуры-импорта в единстве (truecolor, uncompressed, maxSize = 8192), 'gbra' at pixel' (0,0) 'is' "RGBA (0.004, 0.596, 0.702, 1.000)". Кажется, работа. Итак, должна быть конверсия типа? 'R_PS = Math.Round (r_unity * 255)'? – oleotiger

1

Попробуйте отключить сжатие из настроек импорта текстуры в Unity (без сжатия). Кроме того, если вы извлекаете данные во время выполнения, вы можете использовать Texture.LoadBytes(), чтобы избежать артефактов сжатия.

+0

Это точка, которую я пропустил. Это действительно важно! Спасибо! – oleotiger

Смежные вопросы