如何将A16B16G16R16F转换为ARGB32

How to convert A16B16G16R16F to ARGB32?

本文关键字:ARGB32 转换 A16B16G16R16F      更新时间:2023-10-16

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

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

我尝试了每个像素ARGB通道

  1. 读取16位
  2. 转换为32位c基元浮点
  3. 乘以255或1(我不确定半浮点值的有效范围是多少)
  4. 强制转换为BYTE值

但我无法获得可见图像。转换方法可能不正确。

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

在这里的一篇博客文章中解释了读取半浮点的细节,包括代码:

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

在读取浮点数后,您必须执行色调映射操作,以获得PNG允许的0..255范围内的值。这种操作被称为"色调映射",您可以选择执行它。一件非常简单的事情是找到图像中的最大值M,并将所有像素强度缩放255/M以进入所需范围。不过,还有一些算法涉及的内容要多得多。

根据图像的来源,您也可以在写出图像之前应用伽玛校正。因为无论如何都必须使用浮点值,所以我建议使用浮点进行所有计算,并将浮点->字节转换作为最后一步,以避免出现条纹等图像质量问题。