我一直在努力应对今天的最佳挑战,我已经设法使用以前的帖子和其他资源获得了一个好点。
我正在尝试将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中显示的图片
提前致谢:)。
答案 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