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

问题描述 投票:0回答:2

我正在尝试将数据从 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()

上面代码的问题是我不确定

do_query_ieee_block
是什么。我以为它在
pyvisa
下,但在那里找不到。网上查了一下,我明白
query_binary_values
pyvisa
或多或少是一样的,假设数据在
IEEE
中。

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

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% 之间,如上图所示)。

所以基本上我的问题是:

  1. 难道是我没有读取仪器的全部数据?如果是这样,如何克服这个问题?

  2. 会不会是因为包装错误造成的?如果是的话,解决办法是什么?

python png packing ieee pyvisa
2个回答
0
投票

看到一个可能有用的例子:

  1. datatype='B', container=bytearray
    添加为
    query_binary_values()

    的参数
  2. 交替尝试

    ':DISP:DATA? ON,OFF,PNG'

import pyvisa

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", datatype='B', container=bytearray)
path=r"c:\Users\user\Desktop\Scope_Image.png"
with open (path,'wb') as f:
  f.write(byteImage)

0
投票

这可能来得太晚了,但我不久前使用 query_binary_values() 遇到了类似的问题,只是我尝试读回 ARB 波形而不是 png。我找到的解决方案与我的数据的字节顺序有关。查看 is_big_endian 参数,看看这是否会导致问题。我还会研究 header_fmt、delay 和 chunk_size 参数。 https://pyvisa.readthedocs.io/en/latest/api/resources.html#pyvisa.resources.MessageBasedResource.query_binary_values

© www.soinside.com 2019 - 2024. All rights reserved.