Как отобразить изображение байтового массива на QLabel? - PullRequest
0 голосов
/ 28 января 2020

Я прочитал байтовый массив размера: высота * ширина * 3 (3 = RGB), который представляет изображение. Это необработанные данные, которые я получаю с USB-камеры.

Я смог отобразить и сохранить их, используя PIL в этой теме . Теперь я пытаюсь отобразить его в окне PyQt5.

Я пытался использовать QLabel.setPixmap(), но, похоже, не могу создать действительную карту пикселей.

Неудачная попытка чтения массива байтов :

from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import QByteArray
from PyQt5.QtWidgets import QLabel

    self.camLabel = QLabel()
    pixmap = QPixmap()
    loaded = pixmap.loadFromData(QByteArray(img)) # img is a byte array of size: h*w*3
    self.imgLabel.setPixmap(pixmap)

в этом примере loaded возвращает False, поэтому я знаю, imgLabel.setPixmap не будет работать, но я не знаю, как отлаживать дальше, чтобы выяснить, почему загрузка не удалась.

Вторая неудачная попытка использовать библиотеку PIL:

import PIL.Image
import PIL.ImageQt

    pImage = PIL.Image.fromarray(RGB) # RGB is a numpy array of the data in img
    qtImage = PIL.ImageQt.ImageQt(pImage)
    pixmap = QPixmap.fromImage(qtImage)
    self.imgLabel.setPixmap(pixmap)

В этом примере происходит сбой приложения, когда я запускаю: self.imgLabel.setPixmap(pixmap), поэтому, опять же, я не уверен, как далее отладка.

Любая помощь будет оценена!

1 Ответ

2 голосов
/ 28 января 2020

Чтобы получить QPixmap из массива numpy, вы можете сначала создать QImage и использовать его для создания QPixmap. Например:

from PyQt5 import QtCore, QtWidgets, QtGui
import numpy as np

# generate np array of (r, g, b) triplets with dtype uint8
height = width = 255
RGBarray = np.array([[r % 256, c % 256, -c % 256] for r in range(height) for c in range(width)], dtype=np.uint8)

app = QtWidgets.QApplication([])
label = QtWidgets.QLabel()
# create QImage from numpy array
image = QtGui.QImage(bytes(RGBarray), width, height, 3*width, QtGui.QImage.Format_RGB888)
pixmap = QtGui.QPixmap(image)

label.setPixmap(pixmap)
label.show()
app.exec()

screenshot of pixmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...