怎么把A16B16G16R16F转换成ARGB32?

时间:2011-06-15 08:02:38

标签: c++ pixel

我正在编写一个C ++程序,它读取纹理图像文件然后转换并保存为.png。

当我遇到ARGB半精度浮点像素格式时。

我尝试了每个像素的ARGB频道

  1. 读16位
  2. 转换为32位c原始浮动
  3. 乘以255或1(我不确定半浮点值的有效范围是多少)
  4. 转换为BYTE值
  5. 但我无法获得可见的图像。也许转换方法不正确。

    将半精度浮点数转换为8位颜色强度值的公式是什么?

1 个答案:

答案 0 :(得分:1)

在这里的博客文章中解释了阅读半浮动的详细信息,包括代码:

http://fpmurphy.blogspot.com/2008/12/half-precision-floating-point-format_14.html

在读取浮点数后,您必须执行色调映射操作,以获得PNG允许的0..255范围内的值。此操作称为“色调映射”,您可以使用各种选项来执行此操作。一个非常简单的事情是找到图像中的最大值, M 并将所有像素强度缩放255 / M 以进入所需范围。但是,有些算法涉及的内容相当多。

根据图像的来源,您可能还会在写出图像之前应用伽玛校正。因为你必须使用浮点值,我建议使用浮点数进行所有计算,并进行浮点数>字节转换,作为避免像条带这样的图像质量问题的最后一步。