PIL Image to QPixmap转换问题

时间:2016-01-09 18:51:53

标签: python pyqt pyqt4 python-imaging-library pillow

我一直在努力应对今天的最佳挑战,我已经设法使用以前的帖子和其他资源获得了一个好点。

我正在尝试将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 64bit上,使用python 3.4与PyQt4和枕头3.1.0。我得到的结果可以在下面看到。

原始图片

GUI中显示的图片

提前致谢:)。

4 个答案:

答案 0 :(得分:10)

在你的PIL图像中,最后一个波段是alpha通道,而在Qt图像中,alpha通道是第一个(RGBA与ARGB)。可能存在排列乐队的方法,但最简单的方法似乎是使用ImageQt类。

from PIL.ImageQt import ImageQt
qim = ImageQt(im)
pix = QtGui.QPixmap.fromImage(qim)

答案 1 :(得分:1)

这可能很有用

  

从PIL Image对象创建ImageQt对象。此类是QtGui.QImage的子类,这意味着您可以将生成的对象直接传递给PyQt4 / 5 API函数和方法。   当前模式1,L,P,RGB和RGBA图像支持此操作。要处理其他模式,您需要先转换图像。

http://pillow.readthedocs.io/en/3.1.x/reference/ImageQt.html

答案 2 :(得分:1)

我测试过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)

答案 3 :(得分:0)

我不知道为什么,但ImageQt在我的系统Win10,Python3,Qt5中崩溃了。 所以我走向另一个方向并尝试在github上找到解决方案。 此代码不会崩溃,但会在第一篇文章中显示效果。

我的解决方案是,将RGB pic分离为每种颜色,并在将其转换为Pixmap之前将其组合为BGR或BGRA

    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