Python 访问浮点数的原始字节

3
我有一系列的float64,表示rgb值,我想用python将其解释为图像。对于每个float64,位0-15对应于uint8的红色值数据,位16-31是绿色,位32-47是蓝色。如何获取这些整数RGB值?
我知道在python中进行这种位操作非常奇怪,但请耐心等待。基本上,我只需要将float的底层位解释为int(而不是尝试转换)。我找到的最接近允许我访问位值的工具是python struct,但它似乎并没有真正做到我想要的(而且我确定它非常低效)。
我曾尝试使用以下代码来实现:
raw_byte_data = struct.pack('f', float_value)
data_as_int = struct.unpack('i', raw_byte_data)[0]
r = data_as_int & 0xFF
g = data_as_int >> 8 & 0xFF
b = data_as_int >> 16 & 0xFF

我不确定这个做了什么,但是无论它做了什么,它都没有给我想要的输出字节数。希望至少能说明我正在尝试做什么。

1
你的数据来源是什么?你可以使用struct来完成,但也许numpy会更加灵活。 - juanpa.arrivillaga
2
另外,你所问的并没有意义。uint88 位,而不是 16 位。你是指 uint16 吗?还是我对图像表示方式有什么误解? - juanpa.arrivillaga
1
所以,你可能需要类似于r,g,b = struct.unpack_from('HHH', struct.pack('d', 3.14159))这样的东西,其中'd'是双精度浮点数(你想要的是float64而不是float32),并且你想要解包3个无符号长整型(uint16)。 - juanpa.arrivillaga
1个回答

0

经过一番折腾,我终于通过使用Python的struct模块成功让它工作了,感谢this post提供的帮助。请见下方。

def float_to_rgb(f):
    s = struct.pack('>f', f)
    bits = struct.unpack('>l', s)[0]
    r = bits & 0xFF
    g = bits >> 8 & 0xFF
    b = bits >> 16 & 0xFF
    return (r,g,b)

我认为关键在于将字节解包为长整型('l')。


你说的是float64,不是float32... - juanpa.arrivillaga
你的图像只是一个长的一像素高度的字符串吗? - pippo1980

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接