XNA — данные высоты в изображение карты высоты

Здравствуйте, у меня есть данные о высоте в памяти, и иногда (когда я их редактирую) я хочу сохранить их в формате jpg. Это мой код:

float multi = 0.2f;
float[,] heightData = quadTree.HeightData;
Color[] heightMapColors = new Color[heightData.Length];

for (int x = 0; x < heightData.GetLength(0); x++)
{
    for (int y = 0; y < heightData.GetLength(1); y++)
    {
         byte colorData = (byte)(heightData[x, y] / multi);

         heightMapColors[x + y * heightData.GetLength(0)].R = colorData;
         heightMapColors[x + y * heightData.GetLength(0)].G = colorData;
         heightMapColors[x + y * heightData.GetLength(0)].B = colorData;
    }
}

Texture2D heightMap = new Texture2D(device, heightData.GetLength(0), heightData.GetLength(1), false, SurfaceFormat.Color);
heightMap.SetData<Color>(heightMapColors);

using (System.IO.Stream stream = System.IO.File.OpenWrite(@"D:\test.jpg"))
{
     heightMap.SaveAsJpeg(stream, heightData.GetLength(0), heightData.GetLength(1));
}

Я на 100% уверен, что у меня есть данные в heightMapColors, но сохраненный jpg только черный. :/ Это хороший способ, как это сделать, или что-то не так?


person Honza Kovář    schedule 02.05.2012    source источник


Ответы (2)


Альфа не должна быть равна нулю

     heightMapColors[x + y * heightData.GetLength(0)].R = colorData;
     heightMapColors[x + y * heightData.GetLength(0)].G = colorData;
     heightMapColors[x + y * heightData.GetLength(0)].B = colorData;
     heightMapColors[x + y * heightData.GetLength(0)].A = 255;
person Blau    schedule 02.05.2012
comment
Это может быть не проблема, он, кажется, сохраняет его как JPEG, который (в основном) не заботится об альфе. - person Ani; 03.05.2012
comment
вы тестировали его? потому что я почти уверен, что дело - person Blau; 03.05.2012
comment
Ах, кажется, он помещает данные в текстуру, которая, вероятно, предварительно умножает альфу - вот почему это важно? Во всяком случае, это единственное объяснение, которое я могу придумать. Рад, что ты разобрался! - person Ani; 03.05.2012
comment
В любом случае jpeg тоже поддерживает альфа-каналы, я знаю, что это редкость, но Blizzard использует их в текстурах warcraft3... - person Blau; 03.05.2012
comment
Следовательно, в основном :) Я сам использовал их в РЕДКИХ случаях. - person Ani; 03.05.2012
comment
Чтобы уточнить, реализация Texture2D.SaveAsJpeg() заменяет любой пиксель с A = 0 на Color.Transparent, тем самым удаляя любые данные в других цветовых каналах. - person Cole Campbell; 03.05.2012

JPG, вероятно, не является хорошим форматом для хранения карты высот, потому что это формат с потерями. Вы должны поместить его в BMP pr PNG. Тем не менее, каков диапазон вашего «роста»? Похоже, что ваш рост является числом с плавающей запятой, что означает, что он, вероятно, не находится в правильном диапазоне для отображения или даже преобразования в дискретные значения.

Если допустимый диапазон высот от Xf до Yf, преобразуйте его в диапазон от 0 до 255 использование

byteValue = (byte)(((OldValue - OldMin) * (255 - 0)) / (OldMax - OldMin)) + 0

а затем дать ему шанс.

person Ani    schedule 02.05.2012