首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIL图像到QPixmap的转换问题

PIL图像到QPixmap的转换问题
EN

Stack Overflow用户
提问于 2016-01-10 02:51:53
回答 5查看 16.3K关注 0票数 10

我一直在与这个挑战作斗争,今天最好的,我已经设法通过以前的帖子和其他资源获得了很好的分数。

我正在尝试将PIL.Image转换为QPixmap,以便可以在PyQT图形用户界面上使用QgraphicsScene进行显示。然而,当显示图片时,颜色发生了变化??有没有人遇到过这个问题?

我使用的代码如下所示。

代码语言:javascript
复制
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中显示的图片

提前感谢:)。

EN

回答 5

Stack Overflow用户

发布于 2016-01-10 08:07:13

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

代码语言:javascript
复制
from PIL.ImageQt import ImageQt
qim = ImageQt(im)
pix = QtGui.QPixmap.fromImage(qim)
票数 22
EN

Stack Overflow用户

发布于 2018-02-09 20:30:43

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

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

代码语言:javascript
复制
    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
票数 6
EN

Stack Overflow用户

发布于 2018-04-04 11:31:12

我测试过RGB,PIL以qt格式Format_RGB888保存数据

代码语言:javascript
复制
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格式。

代码语言:javascript
复制
im = im.convert("RGBA")
data = im.tobytes("raw","RGBA")
qim = QtGui.QImage(data, im.size[0], im.size[1], QtGui.QImage.Format_RGBA8888)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34697559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档