如何将 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 数据框

如何在 Julia 中将 JSON 字符串转换为多个结构

如何将邮件转换为 eml?

JavaScript类型转换

[].slice.call(arguments)将arguments类数组转换为数组的的实现原理

以 arg 为 'const arg *&' 的函数的参数转换