[英]PIL Image to QPixmap conversion issue
今天,我一直在努力應對這一挑戰,我設法使用以前的帖子和其他資源獲得了一個很好的觀點。
我正在嘗試將 PIL.Image 轉換為 QPixmap,以便我可以在 PyQT GUI 上使用 QgraphicsScene 進行顯示。 但是當顯示圖片時顏色發生了變化?? 有沒有人遇到過這個問題?
我為此使用的代碼如下。
self.graphicsScene.clear()
im = Image.open('Penguins.jpg')
im = im.convert("RGBA")
data = im.tobytes("raw","RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_ARGB32)
pix = QtGui.QPixmap.fromImage(qim)
self.graphicsScene.addPixmap(pix)
self.graphicsView.fitInView(QtCore.QRectF(0,0,im.size[0], im.size[1]), QtCore.Qt.KeepAspectRatio)
self.graphicsScene.update()
我在 Windows 7 64 位上,使用 python 3.4 和 PyQt4 和枕頭 3.1.0。 我得到的結果如下所示。
原圖
GUI中顯示的圖片
提前致謝 :)。
在您的 PIL 圖像中,最后一個波段是 alpha 通道,而在 Qt 圖像中,alpha 通道是第一個(RGBA 與 ARGB)。 可能有排列波段的方法,但最簡單的方法似乎是使用 ImageQt 類。
from PIL.ImageQt import ImageQt
qim = ImageQt(im)
pix = QtGui.QPixmap.fromImage(qim)
我不知道為什么,但 ImageQt 在我的系統 Win10、Python3、Qt5 中崩潰了。 所以我去了另一個方向並嘗試了在 github 上找到的解決方案。 此代碼不會崩潰,但會產生第一篇文章中顯示的效果。
我對此的解決方案是,將 RGB 圖片分離為每種顏色並將其組裝為 BGR 或 BGRA,然后再將其轉換為 Pixmap
def pil2pixmap(self, im):
if im.mode == "RGB":
r, g, b = im.split()
im = Image.merge("RGB", (b, g, r))
elif im.mode == "RGBA":
r, g, b, a = im.split()
im = Image.merge("RGBA", (b, g, r, a))
elif im.mode == "L":
im = im.convert("RGBA")
# Bild in RGBA konvertieren, falls nicht bereits passiert
im2 = im.convert("RGBA")
data = im2.tobytes("raw", "RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_ARGB32)
pixmap = QtGui.QPixmap.fromImage(qim)
return pixmap
我已經測試過 RGB,PIL 使用 qt 格式Format_RGB888
保存數據:
im = im.convert("RGB")
data = im.tobytes("raw","RGB")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGB888)
我還沒有測試過,但我假設對於 RGBA 它將是等效格式Format_RGBA8888
:
im = im.convert("RGBA")
data = im.tobytes("raw","RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGBA8888)
這可能有用
從 PIL Image 對象創建一個 ImageQt 對象。 該類是 QtGui.QImage 的子類,這意味着您可以將生成的對象直接傳遞給 PyQt4/5 API 函數和方法。 此操作目前支持模式 1、L、P、RGB 和 RGBA 圖像。 要處理其他模式,您需要先轉換圖像。
https://pillow.readthedocs.io/en/stable/reference/ImageQt.html
@titusjan 的回答對我不起作用。 @Michael 和 @Jordan 都有有效的解決方案。 @Michael's 的一個更簡單的版本就是重新定義如何為圖像寫入字節。 所以這對我有用:
im2 = im.convert("RGBA")
data = im2.tobytes("raw", "BGRA")
qim = QtGui.QImage(data, im.width, im.height, QtGui.QImage.Format_ARGB32)
pixmap = QtGui.QPixmap.fromImage(qim)
唯一的區別是我交換了編碼的順序,例如“BGRA”而不是“RGBA”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.