如何将 A16B16G16R16F 转换为 ARGB32?
Posted
技术标签:
【中文标题】如何将 A16B16G16R16F 转换为 ARGB32?【英文标题】:How to convert A16B16G16R16F to ARGB32? 【发布时间】:2011-06-15 08:02:37 【问题描述】:我正在编写一个 C++ 程序,它读取纹理图像文件然后转换并保存为 .png。
当我遇到了 ARGB 半精度浮点像素格式。
我尝试了每个像素的 ARGB 通道
-
读取 16 位
转换为 32 位 c 原始浮点数
乘以 255 或 1(我不确定半浮点值的有效范围是多少)
转换为 BYTE 值
但我无法获得可见图像。可能转换方法不正确。
半精度浮点数转换为8bit颜色强度值的公式是什么?
【问题讨论】:
你确定它是半浮动的而不是unsigned short int
?
@VJo 纹理格式的名称以 F 结尾,因此它们是半浮点数。不过,这些半浮点数的格式因 GPU 而异。
@Jasper 是的,但是对于“纹理图像文件”,半浮点到底是什么?据我所知不存在。如果您想谈论着色器,那么您可以谈论半浮点数。
【参考方案1】:
阅读半浮点数的细节在博文中有解释,包括代码在这里:
http://fpmurphy.blogspot.com/2008/12/half-precision-floating-point-format_14.html
读入浮点数后,您必须执行色调映射操作以获取 PNG 允许的 0..255 范围内的值。此操作称为“色调映射”,您有多种选择来执行它。一个非常简单的方法是找到图像中的最大值 M 并将所有像素强度缩放 255 / M 以进入所需的范围。不过,有些算法涉及的内容要多得多。
根据图像的来源,您还可以在写出图像之前应用伽马校正。因为无论如何您都必须使用浮点值,所以我建议使用浮点数进行所有计算,并将浮点数->字节转换作为最后一步,以避免像条带这样的图像质量问题。
【讨论】:
以上是关于如何将 A16B16G16R16F 转换为 ARGB32?的主要内容,如果未能解决你的问题,请参考以下文章
将标准 python 键值字典列表转换为 pyspark 数据框