c - 将 float 32 精确转换为 unsigned Short 或 unsigned char

标签 c casting char unsigned short

首先,很抱歉,如果这是重复的,我找不到任何主题回答我的问题。

我正在编写一个小程序,用于将 32 位浮点值转换为短整型(16 位)和无符号字符(8 位)值。这是用于 HDR 图像的目的。

来自here我可以获得以下函数(无需夹紧):

static inline uint8_t u8fromfloat(float x)
{
    return (int)(x * 255.0f);
}

我想以同样的方式,我们可以通过乘以 (pow( 2,16 ) -1) 得到短整型

但后来我最终考虑了有序抖动,尤其是拜耳抖动。要转换为 uint8_t,我想我可以使用 4x4 矩阵和 8x8 矩阵来表示无符号短整型。

我还想到了一个查找表来加速这个过程,这样:

uint16_t LUT[0x10000] // 2¹⁶ values contained

并存储对应于 float 的 2^16 个无符号短值。 由于 unsigned Short ↔ unsigned int 之间的隐式转换,该表也可用于 uint8_t

但是这样的查找表占用的内存不是很大吗?另外,如何填写这样的表格?!

现在我很困惑,你认为什么是最好的?

在 uwind 回答后编辑:现在假设我也想同时进行基本的颜色空间转换,即在转换为 U8/U16 之前,进行颜色空间转换(以浮点形式),然后将其缩小到U8/U16。在这种情况下使用 LUT 不是更有效吗?是的,我仍然会遇到索引 LUT 的问题。

最佳答案

在我看来,查找表没有帮助,因为为了对其进行索引,您需要将 float 转换为某种整数类型。第 22 条军规。

该表需要 0x10000 * sizeof (uint16_t) 字节,即 128 KB。按照现代标准来看,并不算多,但另一方面,缓存也很宝贵。但是,正如我所说,该表并没有给解决方案带来太多帮助,因为您需要将浮点型转换为整数才能建立索引。

您可以创建一个由浮点的原始位重新解释为整数进行索引的表,但这必须是 32 位,这会变得非常大(8 GB 左右)。

进行您概述的直接运行时转换。

关于c - 将 float 32 精确转换为 unsigned Short 或 unsigned char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14213566/

相关文章:

typescript - 为什么 typescript 中有两种不同的转换语法?

c - 为什么我的函数没有删除所有数字?

c - Ptrace 为 execve 捕获许多陷阱

c++ - 混合 C/C++ 代码产生 "undefined symbol"与共享库

c - 在编译时在所有 .c 源文件中包含 #define

将一个字符与一系列字符进行比较

c++ - ANSI代码页中wchar_t char之间的转换

c - 我必须为 NULL 指针进行 malloc 吗?我什么时候需要为指针进行 malloc?

c++ - 什么类型的转换从 parent 到 child ?

C++多态性——找出派生类的类型