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)
?
Купите, как можно преобразовать значение 'rgba' в единицу (диапазон 0 ~ 1) в аналогичное значение, как в PS (диапазон 0 ~ 255)? Дело в том, что значение 'r' равно' 0' в единстве пикселя в '(0,0)'. Но в PS значение r равно '1'. Если я преобразую значение с помощью параметра 'r_PS = r_unity * 255', результат кажется несопоставимым. – oleotiger
Согласен, результаты кажутся совершенно непревзойденными. Вы должны просто иметь возможность умножить на 255, как вы делаете, но если не происходит округления, это действительно не должно быть 0. Что беспокоит, действительно, значение B. '.718 * 256 = 183', что более чем 179. Это может быть сжатие, как указал Дэвид, или вы могли бы каким-то образом сравнить разные пиксели. – code11
Я установил настройку текстуры-импорта в единстве (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