Python PIL图像到QPixmap转换问题
今天我一直在努力应对这一挑战,利用以前的帖子和其他资源,我成功地获得了一个好的观点 我正在尝试将PIL.Image转换为QPixmap,以便在PyQT GUI上使用QGraphicscene显示。但是,当显示图片时,颜色发生了变化??有没有人经历过这个问题 我使用的代码如下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
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,因此此解决方案非常有效。