我一直在与这个挑战作斗争,今天最好的,我已经设法通过以前的帖子和其他资源获得了很好的分数。
我正在尝试将PIL.Image转换为QPixmap,以便可以在PyQT图形用户界面上使用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()我使用的是Windows7 64位操作系统,使用的是带有PyQt4和pillow 3.1.0的Python3.4。我得到的结果可以在下面看到。
原始图片

在GUI中显示的图片

提前感谢:)。
发布于 2016-01-10 08:07:13
在您的PIL图像中,最后一个波段是alpha通道,而在Qt图像中,alpha通道是第一个(RGBA与ARGB)。可能有一些方法可以改变波段,但最简单的方法似乎是使用ImageQt类。
from PIL.ImageQt import ImageQt
qim = ImageQt(im)
pix = QtGui.QPixmap.fromImage(qim)发布于 2018-02-09 20:30:43
我不知道为什么,但是ImageQt在我的系统Win10,Python3,Qt5中崩溃了。所以我转到另一个方向,尝试了在github上找到的解决方案。这段代码不会崩溃,但会在第一篇文章中显示效果。
我的解决方案是,将RGB图片分离到每种颜色,并在将其转换为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发布于 2018-04-04 11:31:12
我测试过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)https://stackoverflow.com/questions/34697559
复制相似问题