在使用PIL和PyQt绘制QImage到小部件时的错误

2 投票
2 回答
5170 浏览
提问于 2025-04-15 23:58

我正在尝试写一个小的图形应用程序,需要用PIL构建一些图像,然后在一个小部件中显示出来。图像构建得很正确(我可以用im.show()来检查),我可以把它转换成QImage,然后正常保存到磁盘(用QImage.save),但是如果我直接在我的QWidget上绘制它,它只显示一个白色的方块。

这里我把不工作的代码注释掉了(把Image转换成QImage再转成QPixmap结果是一个白色方块),然后我做了一个小技巧,把图像保存到一个临时文件,然后直接在QPixmap中加载,这样可以工作,但这不是我想要的做法。

https://gist.github.com/f6d479f286ad75bf72b7

有人有什么想法吗?

如果有帮助的话,当我尝试把我的QImage保存为BMP文件时,我可以访问它的内容,但如果我尝试保存为PNG文件,它就完全是白色的。

2 个回答

1

我之前在Qt-3中也做过类似的事情,使用了QImage.loadFromData()这个方法。我想在Qt-4中也应该可以用。

self.image = QImage()
if self.image.loadFromData(image_data,"PNG"):
    # image loaded successfully
5

我也遇到过同样的问题,然后我发现,ImageQt对象其实不是QImage,但可以很简单地转换成QImage。

#!/usr/bin/python
# -*- coding: utf-8 -*-
#written by Sebastian Stetter in 2010


import sys
from PIL import Image
from PIL.ImageQt import ImageQt

from PyQt4.QtGui import *
from PyQt4.QtCore import *



def PILimageToQImage(pilimage):
    """converts a PIL image to QImage"""
    imageq = ImageQt(pilimage) #convert PIL image to a PIL.ImageQt object
    qimage = QImage(imageq) #cast PIL.ImageQt object to QImage object -that´s the trick!!!
    return qimage




if __name__ == "__main__":
    #Testcode
    app = QApplication(sys.argv)

    pim = Image.open(unicode(QFileDialog().getOpenFileName()))
    pim.show() #show pil image

    qim = PILimageToQImage(pim)
    pm = QPixmap(qim)
    lbl = QLabel()
    lbl.setPixmap(pm)
    lbl.show() #show label with qim image

    sys.exit(app.exec_())

撰写回答