Python 将浮点列表转换为类似字节的对象会导致图像损坏

Python 将浮点列表转换为类似字节的对象会导致图像损坏,python,png,packing,ieee,pyvisa,Python,Png,Packing,Ieee,Pyvisa,我正在尝试将数据从Keysight范围转换为.png图像。 当我在网上查看如何操作时,我无意中发现了以下代码: # Download the screen image. # -------------------------------------------------------- sDisplay = do_query_ieee_block(":DISPlay:DATA? PNG") # Save display data values to file. f = ope

我正在尝试将数据从Keysight范围转换为
.png
图像。 当我在网上查看如何操作时,我无意中发现了以下代码:

# Download the screen image.
# --------------------------------------------------------
sDisplay = do_query_ieee_block(":DISPlay:DATA? PNG")
# Save display data values to file.
f = open("screen_image.png", "wb")
f.write(sDisplay)
f.close()
import pyvisa
import struct

IDN="SomeScopeIDN" #something like 'USB0::0xhhhh::0xhhhh::MYdddddddd::0::INSTR' 
scope=pyvisa.ResourceManager().open_resource(IDN)
binImage=self.scope.query_binary_values(":DISPlay:DATA? PNG") #This gets a list of floats
byteImage=struct.pack('%sf' % len(binImage),*binImage) #Convert the list to bytes-like object
path=r"c:\Users\user\Desktop\Scope_Image.png"
with open (path,'wb') as f:
  f.write(byteImage)
上面代码的问题是我不确定什么是
do\u query\u ieee\u block
。我以为它在
pyvisa
下,但在那里找不到。通过在线查看,我了解到
query\u binary\u value
pyvisa
假设数据在
IEEE
中大致相同

根据这些信息,我编写了以下代码:

# Download the screen image.
# --------------------------------------------------------
sDisplay = do_query_ieee_block(":DISPlay:DATA? PNG")
# Save display data values to file.
f = open("screen_image.png", "wb")
f.write(sDisplay)
f.close()
import pyvisa
import struct

IDN="SomeScopeIDN" #something like 'USB0::0xhhhh::0xhhhh::MYdddddddd::0::INSTR' 
scope=pyvisa.ResourceManager().open_resource(IDN)
binImage=self.scope.query_binary_values(":DISPlay:DATA? PNG") #This gets a list of floats
byteImage=struct.pack('%sf' % len(binImage),*binImage) #Convert the list to bytes-like object
path=r"c:\Users\user\Desktop\Scope_Image.png"
with open (path,'wb') as f:
  f.write(byteImage)
这会创建一个图像,但结果不好:

从剪贴工具:

正如您所看到的,只有图像的上10%是好的,而其余的则不是好的(需要指出的是,每次我从示波器检索新数据时,我都会得到一个不同的损坏区域,该区域在图片的50-90%之间。大多数情况下,损坏区域在80-90%之间,如上图所示)

所以基本上我的问题是:

  • 可能是我没有从仪器中读取全部数据吗?如果是这样,我们如何克服这个问题

  • 这会不会是因为包装不当造成的?如果是,解决方案是什么


  • 看到一个可能有用的示例:

  • datatype='B',container=bytearray
    作为参数添加到
    query\u binary\u values()

  • 尝试
    ”:显示:数据?打开、关闭、PNG'
    可互换


  • 第一个代码片段的结果是什么?Keysight示波器的手册对
    :DISPlay:DATA有何说明?PNG
    命令?您确定它返回的是浮点列表而不是整数列表,或者只是PNG图像的二进制数据,在将其写入文件之前不需要进行任何转换吗?@mkrieger1我无法获得第一个代码的结果,因为我没有IEEE属性。。手册上说没问题。binImage的输出为浮点数(例如binImage[5]为-2.6164308388710655e+33…)。我试图将二进制数据原样保存到PNG中,但它说它需要一个类似字节的对象,而不是一个列表,因此转换为什么这么说?您在问题代码中使用了
    do\u query\u ieee\u块
    。你是说别的还是我遗漏了什么?再看看这个问题。。。我在网上的某个地方得到了代码,但是Pyvisa没有这个属性,只有query\u binary,但是对话会导致图像损坏。。你可以在你提到的代码下面看到我的代码。。