Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PIL图像到QPixmap转换问题_Python_Pyqt_Pyqt4_Python Imaging Library_Pillow - Fatal编程技术网

Python PIL图像到QPixmap转换问题

Python PIL图像到QPixmap转换问题,python,pyqt,pyqt4,python-imaging-library,pillow,Python,Pyqt,Pyqt4,Python Imaging Library,Pillow,今天我一直在努力应对这一挑战,利用以前的帖子和其他资源,我成功地获得了一个好的观点 我正在尝试将PIL.Image转换为QPixmap,以便在PyQT GUI上使用QGraphicscene显示。但是,当显示图片时,颜色发生了变化??有没有人经历过这个问题 我使用的代码如下 self.graphicsScene.clear() im = Image.open('Penguins.jpg') im = im.convert("RGBA") data = im.tobytes("raw","RGBA

今天我一直在努力应对这一挑战,利用以前的帖子和其他资源,我成功地获得了一个好的观点

我正在尝试将PIL.Image转换为QPixmap,以便在PyQT GUI上使用QGraphicscene显示。但是,当显示图片时,颜色发生了变化??有没有人经历过这个问题

我使用的代码如下

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以及pillow 3.1.0。我得到的结果可以在下面看到

原画

图形用户界面中显示的图片


提前感谢:)。

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

from PIL.ImageQt import ImageQt
qim = ImageQt(im)
pix = QtGui.QPixmap.fromImage(qim)
这也许有用

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


我不知道为什么,但是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

我已经测试了RGB,PIL使用qt格式保存数据
格式\u RGB888

im = im.convert("RGB")
data = im.tobytes("raw","RGB")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGB888)
im = im.convert("RGBA")
data = im.tobytes("raw","RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGBA8888)
我还没有测试它,但我假设对于RGBA,它将是等效的格式
格式\u RGBA8888

im = im.convert("RGB")
data = im.tobytes("raw","RGB")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGB888)
im = im.convert("RGBA")
data = im.tobytes("raw","RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGBA8888)

正如@Michael在其回答中提到的,这会导致崩溃,例如Win10/Python3.7.4/PyQt5,您知道为什么以及如何轻松修复它,而不是使用Michael冗长的解决方法吗?嗨@theozh。我不知道,但我没有参与枕头项目,所以我不是该问的人。我建议在中做一个bug报告。请确保包含一条复制错误消息和完整的堆栈跟踪。RGBA(第二个)对我有效,而第一个不行。ImageQt也不适用于PySide2,因此此解决方案非常有效。