首頁 > 軟體

關於PyQt5中QtGui.QImage圖片顯示問題解析

2022-03-08 13:02:10

前言

PyQt是Python語言環境的GUI程式設計解決方案之一,另外還有PyGTK、wxPython等也較為常用。PyQt作為Qt語言的Python擴充套件,可以用來方便快速的開發介面應用。

PyQt5中的QtGui.QImage圖片顯示

import os.path as osp
import cv2
from qtpy import QtCore
from qtpy import QtWidgets
from qtpy import QtGui


# TracelessLe注:程式碼範例,不可直接執行

class MainWindow(QtWidgets.QMainWindow):
	def __init__(self):
		self.image = QtWidgets.QLabel()

    def show_img(self, img_path):
        self.image.clear()
        img_np = cv2.imread(img_path)
        width = img_np.shape[1]
        height = img_np.shape[0]
        img_rgb_data = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB)
        # label_data = QtGui.QImage(img_rgb_data.data, width, height, QtGui.QImage.Format_RGB888)  # 這種方式可能會有部分圖片顯示有問題
        label_data = QtGui.QImage(img_rgb_data.data, width, height, width*3, QtGui.QImage.Format_RGB888)  # 針對RGB圖顯示的正確方式
        self.image.setPixmap(QtGui.QPixmap.fromImage(label_data))

圖片顯示問題分析

如上述程式碼中講到的那樣,針對RGB三通道圖片顯示的正確方法是使用:

label_data = QtGui.QImage(img_rgb_data.data, width, height, width*3, QtGui.QImage.Format_RGB888) 

進入QtGui.QImage類,可以看到其支援的圖片資料格式有很多:

從QT官網也能找到支援的影象格式:

而圖片初始化方法也有很多:

從使用方式來看,主要分為三大類:
(1)傳入影象尺寸或長寬,以及影象格式(QImage.Format
(2)傳入影象資料,影象尺寸或長寬,以及影象格式
(3)傳入影象路徑,影象格式

通常對於已經使用OpenCV讀取和處理過的圖片,我們會使用方式(2)來初始化。

對於常用的RGB三通道影象,初始化時的影象格式一般設為QtGui.QImage.Format_RGB888

而在使用時,正確的使用方式是:

def __init__(self, data: bytes, width: int, height: int, bytesPerLine: int, format: 'QImage.Format')

如果使用

def __init__(self, data: bytes, width: int, height: int, format: 'QImage.Format')

方法初始化,可能會遇到顯示上的一些問題。例如圖片斜偏顯示、圖片黑白條間隔顯示、圖片載入直接崩潰等異常。

對比兩種方法,發現問題在於bytesPerLine: int引數上。該引數指定了bytes型輸入資料data在資料排布上的間隔(bytesPerLine)。如果未指定,對於某些輸入資料,QtGui.QImage無法正常推斷出資料排列格式,則會出現上述中的顯示異常問題。

版權說明

本文為原創文章,獨家釋出在blog.csdn.net/TracelessLe。未經個人允許不得轉載。

參考資料

[1] QImage Class | Qt GUI 5.15.8
[2] What is PyQt?
[3] PYQT QTGUI.QIMAGE顯示圖片異常,發生斜偏異常,且黑白顯色_lockhou的部落格-CSDN部落格
[4] QImage.Format
[5] QImage
[6] QImage與cv::Mat轉換; - 時光旅者 - 部落格園
[7] 基於PyQt Canvas Matplotlib圖形繪製_battlestar的部落格-CSDN部落格_figurecanvas

到此這篇關於PyQt5中的QtGui.QImage圖片顯示問題分析的文章就介紹到這了,更多相關PyQt5 QtGui.QImage圖片顯示內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com