Python 将float32转换为位等效int32

Python 将float32转换为位等效int32,python,image,types,binary,type-conversion,Python,Image,Types,Binary,Type Conversion,Python中的Pillow模块坚持打开一个32位/像素的TIFF文件,就像像素是float32类型一样,而我认为正确的解释是unsigned int32。如果继续将数据加载到float32类型的640x512数组中,如何在保留底层二进制表示的同时将其重新键入uint32 在Fortran和C语言中,很容易让不同类型的指针或数据结构指向同一个物理内存块,这样就可以根据我想要的任何类型轻松地解释原始内存内容。Python中是否有一个等价的过程 示例如下(请注意,我没有关于压缩等的信息;所讨论的文件

Python中的Pillow模块坚持打开一个32位/像素的TIFF文件,就像像素是float32类型一样,而我认为正确的解释是unsigned int32。如果继续将数据加载到float32类型的640x512数组中,如何在保留底层二进制表示的同时将其重新键入uint32

在Fortran和C语言中,很容易让不同类型的指针或数据结构指向同一个物理内存块,这样就可以根据我想要的任何类型轻松地解释原始内存内容。Python中是否有一个等价的过程

示例如下(请注意,我没有关于压缩等的信息;所讨论的文件是由商业软件程序从专有文件格式中提取的):

[-9.99117374-10.36103535-9.80696869…-18.41988373-18.35027885 -18.69905663]


假设您的
im.mode
最初等于
F
,您可以强制Pillow在不同的模式下重新加载相同的数据(这确实是一个非常不寻常的愿望),方式有点像这样:

imnew = im.convert(mode='I')
imnew.frombytes(im.tobytes())
更一般地说(在PIL的上下文之外),每当您遇到在Python中处理原始内存表示的需要时,您通常应该使用
numpy
或Python内置的
memoryview
类和
struct
模块

下面是一个将numpy
float32
数组重新解释为
int32
的示例:

a = np.array([1.0, 2.0, 3.0], dtype='float32')
a_as_int32 = a.view('int32')
下面是使用
memoryview
执行相同操作的示例:

# Create a memory buffer
b = bytearray(4*3)

# Write three floats
struct.pack_into('fff', b, 0, *[1.0, 2.0, 3.0])

# View the same memory as three ints
mem_as_ints = memoryview(b).cast('I')

在这种情况下,答案是枕头正在加载具有正确类型(float 32)的图像,如从热敏相机导出的图像中指定的。不需要将图像强制转换为整数,这样做将导致错误的结果

你能不能给你的问题增加一个可复制的例子,或者至少更多的细节?它是压缩的TIFF图像吗?如何打开图像,以及如何知道Pillow以浮点形式打开图像?请参阅添加的示例代码。但请注意,我的问题是一般性的(不依赖于TIF文件):通常,如何更改Python数据结构(例如numpy数组)中二进制数据的解释?通过一些测试,32位浮点似乎是灰度图像的有效TIFF格式。是否可能TIFF文件实际上是浮动的,而枕头和numpy做的是正确的?试着绘制数组,看看它是否再现了图像。至于像在C中一样转换数据结构,你可以使用模块来实现。TIF图像是我问题的背景,但不是问题所在。
# Create a memory buffer
b = bytearray(4*3)

# Write three floats
struct.pack_into('fff', b, 0, *[1.0, 2.0, 3.0])

# View the same memory as three ints
mem_as_ints = memoryview(b).cast('I')