關(guān)于PyQt5中QtGui.QImage圖片顯示問(wèn)題解析
前言
PyQt是Python語(yǔ)言環(huán)境的GUI編程解決方案之一,另外還有PyGTK、wxPython等也較為常用。PyQt作為Qt語(yǔ)言的Python擴(kuò)展,可以用來(lái)方便快速的開(kāi)發(fā)界面應(yīng)用。
PyQt5中的QtGui.QImage圖片顯示
import os.path as osp import cv2 from qtpy import QtCore from qtpy import QtWidgets from qtpy import QtGui # TracelessLe注:代碼示例,不可直接執(zhí)行 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) # 這種方式可能會(huì)有部分圖片顯示有問(wèn)題 label_data = QtGui.QImage(img_rgb_data.data, width, height, width*3, QtGui.QImage.Format_RGB888) # 針對(duì)RGB圖顯示的正確方式 self.image.setPixmap(QtGui.QPixmap.fromImage(label_data))
圖片顯示問(wèn)題分析
如上述代碼中講到的那樣,針對(duì)RGB三通道圖片顯示的正確方法是使用:
label_data = QtGui.QImage(img_rgb_data.data, width, height, width*3, QtGui.QImage.Format_RGB888)
進(jìn)入QtGui.QImage類(lèi),可以看到其支持的圖片數(shù)據(jù)格式有很多:
從QT官網(wǎng)也能找到支持的圖像格式:
而圖片初始化方法也有很多:
從使用方式來(lái)看,主要分為三大類(lèi):
(1)傳入圖像尺寸或長(zhǎng)寬,以及圖像格式(QImage.Format
)
(2)傳入圖像數(shù)據(jù),圖像尺寸或長(zhǎng)寬,以及圖像格式
(3)傳入圖像路徑,圖像格式
通常對(duì)于已經(jīng)使用OpenCV讀取和處理過(guò)的圖片,我們會(huì)使用方式(2)來(lái)初始化。
對(duì)于常用的RGB三通道圖像,初始化時(shí)的圖像格式一般設(shè)為QtGui.QImage.Format_RGB888
。
而在使用時(shí),正確的使用方式是:
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')
方法初始化,可能會(huì)遇到顯示上的一些問(wèn)題。例如圖片斜偏顯示、圖片黑白條間隔顯示、圖片加載直接崩潰等異常。
對(duì)比兩種方法,發(fā)現(xiàn)問(wèn)題在于bytesPerLine: int
參數(shù)上。該參數(shù)指定了bytes
型輸入數(shù)據(jù)data
在數(shù)據(jù)排布上的間隔(bytesPerLine
)。如果未指定,對(duì)于某些輸入數(shù)據(jù),QtGui.QImage
無(wú)法正常推斷出數(shù)據(jù)排列格式,則會(huì)出現(xiàn)上述中的顯示異常問(wèn)題。
版權(quán)說(shuō)明
本文為原創(chuàng)文章,獨(dú)家發(fā)布在blog.csdn.net/TracelessLe。未經(jīng)個(gè)人允許不得轉(zhuǎn)載。
參考資料
[1] QImage Class | Qt GUI 5.15.8
[2] What is PyQt?
[3] PYQT QTGUI.QIMAGE顯示圖片異常,發(fā)生斜偏異常,且黑白顯色_lockhou的博客-CSDN博客
[4] QImage.Format
[5] QImage
[6] QImage與cv::Mat轉(zhuǎn)換; - 時(shí)光旅者 - 博客園
[7] 基于PyQt Canvas Matplotlib圖形繪制_battlestar的博客-CSDN博客_figurecanvas
到此這篇關(guān)于PyQt5中的QtGui.QImage圖片顯示問(wèn)題分析的文章就介紹到這了,更多相關(guān)PyQt5 QtGui.QImage圖片顯示內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python讀入mnist二進(jìn)制圖像文件并顯示實(shí)例
這篇文章主要介紹了Python讀入mnist二進(jìn)制圖像文件并顯示實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04基于Python輕松制作一個(gè)股票K線圖網(wǎng)站
在當(dāng)今這個(gè)人手一個(gè)?Web?服務(wù)的年代,GUI?程序還是沒(méi)有?Web?服務(wù)來(lái)的香啊。所以本文將用Python制作一個(gè)簡(jiǎn)單的股票K線圖網(wǎng)站,感興趣的可以了解一下2022-09-09Python實(shí)現(xiàn)在線音樂(lè)播放器
這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)在線音樂(lè)播放器的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Scrapy爬蟲(chóng)文件批量運(yùn)行的實(shí)現(xiàn)
這篇文章主要介紹了Scrapy爬蟲(chóng)文件批量運(yùn)行的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09淺談Django 頁(yè)面緩存的cache_key是如何生成的
這篇文章主要介紹了Django 頁(yè)面緩存的cache_key是如何生成的,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python趣味編程實(shí)現(xiàn)手繪風(fēng)視頻示例
本文與計(jì)算機(jī)視覺(jué)相關(guān),使用Python將圖片由自然風(fēng)轉(zhuǎn)化為手繪風(fēng),期間未對(duì)圖片進(jìn)行任何預(yù)處理、后處理;代碼中只借助了兩個(gè)常見(jiàn)庫(kù),核心計(jì)算由Numpy負(fù)責(zé) ,Pillow 負(fù)責(zé)圖片讀寫(xiě)2021-10-10Python中實(shí)現(xiàn)一行拆多行和多行并一行的示例代碼
這篇文章主要介紹了Python中實(shí)現(xiàn)一行拆多行和多行并一行的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09