Преобразование списка с плавающей запятой в байтовый объект приводит к повреждению изображения - PullRequest
2 голосов
/ 03 августа 2020

Я пытаюсь преобразовать данные из осциллографа 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)

Это создает изображение, но результат плохой:

Corrupted Image

and from snipping tool:

Поврежденное изображение

Как видите, только верхние 10% изображения хороши, а остальные нет (будет упомянуто, что каждый раз, когда я извлекаю новые данные из осциллографа, я получаю другую область, которая поврежден, что составляет от 50 до 90% изображения. В большинстве случаев поврежденная область составляет от 80 до 90%, как показано на рисунке выше).

Итак, в основном мои вопросы:

  1. Может быть, я не считываю все данные с прибора? и если да, то как решить эту проблему?

  2. Может ли это произойти из-за неправильной упаковки? Если да, то какое решение?

1 Ответ

0 голосов
/ 27 августа 2020

См. Пример, который может оказаться полезным:

  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)
...