问题描述
|
我正在编写一个C ++程序,该程序读取纹理图像文件,然后将其转换并另存为.png。
当我遇到ARGB半精度浮点像素格式时。
我尝试了每个像素的ARGB通道
读取16位
转换为32bit C原始浮点数
乘以255或1(我不确定半浮点值的有效范围是多少)
转换为BYTE值
但我看不到可见的图像。也许convert方法不正确。
将半精度浮点数转换为8bit色彩强度值的公式是什么?
解决方法
此处的博客文章中解释了读取半浮点数的详细信息,包括代码:
http://fpmurphy.blogspot.com/2008/12/half-precision-floating-point-format_14.html
读完浮动信息后,您将必须执行色调映射操作,以获取介于PNG允许的0..255范围内的值。此操作称为“音调映射”,您可以通过多种选择来执行此操作。一个非常简单的事情是找到图像中的最大值M并将所有像素强度缩放255 / M以进入所需范围。但是,有些算法涉及的更多。
根据图像的来源,您也可以在写出图像之前应用伽玛校正。因为无论如何都必须使用浮点值,所以我建议使用浮点数进行所有计算,并进行浮点数->字节转换,这是避免出现像条带这样的图像质量问题的最后一步。