将浮点数的高度图数组导出为16bit原始

时间:2018-11-01 14:45:52

标签: c++ terrain heightmap

我有一个{x {1}}的256x256数组,代表一个高度图。 我想将其导出为每像素16位的RAW图像。将float转换为float的正确方法是什么。 (我知道精度损失

我快速而肮脏的测试代码:

uint16_t

编辑:我的目标是将应用程序中生成的高度图导出到图像中。

1 个答案:

答案 0 :(得分:1)

我认为,OP希望使用uint16_t的整个范围,即0 ... 65535。

在这种情况下,要移动并缩放到新范围的高度值,即比例(max-min)-> 65535,并转换min-> 0。

这可能看起来像这样:

        value - min
pixel = ----------- * 65535
         max - min

在代码中:

#include <cstdint>
#include <iomanip>
#include <iostream>

std::uint16_t floatToUInt16(float value, float min, float max)
{
  return (std::uint16_t)((value - min) / (max - min) * 65535.0f);
}

int main()
{
  float min = -49.77f, max = 357.84f;
  // some test values
  float values[] = { 0.0f, min, max, min / 2, max / 2 };
  // test conversion
  for (float value : values) {
    std::cout << std::fixed << std::setw(10) << value
      << " -> "
      << std::setw(5) << floatToUInt16(value, min, max)
      << '\n';
  }
  return 0;
}

输出:

  0.000000 ->  8001
-49.770000 ->     0
357.839996 -> 65535
-24.885000 ->  4000
178.919998 -> 36768

Live Demo on coliru

如果这是循环完成的,我会对其进行优化。 因此,66535.0f / (max - min)是应用于所有高度值的固定因子。 因此,值得在进入循环之前计算该因子。