簡體   English   中英

PIL 圖像到 QPixmap 的轉換問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM