Ошибка при рисовании QImage на виджете с помощью PIL и PyQt

Я пытаюсь написать небольшое графическое приложение, и мне нужно создать какое-то изображение с помощью PIL, которое я показываю в виджете. Изображение построено правильно (я могу проверить с помощью im.show()), я могу преобразовать его в QImage, который я могу нормально сохранить на диск (используя QImage.save), но если я попытаюсь нарисовать его прямо на моем QWidget , он показывает только белый квадрат.

Здесь я закомментировал код, который не работает (преобразование изображения в QImage, затем QPixmap приводит к белому квадрату), и я сделал грязный хак, чтобы сохранить изображение во временный файл и загрузить его непосредственно в QPixmap, который работает, но это не то, чем я хочу заниматься

https://gist.github.com/f6d479f286ad75bf72b7

У кого-то есть идея?

Если это может помочь, когда я пытаюсь сохранить свой QImage в файле BMP, я могу получить доступ к его содержимому, но если я попытаюсь сохранить его в формате PNG, он будет полностью белым.


person oulipo    schedule 14.06.2010    source источник


Ответы (2)


Была та же проблема, а затем заметил, что объекты ImageQt не являются QImages, а могут быть просто приведены к этим

#!/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_())
person Sebastian Stetter    schedule 16.12.2010

Я сделал то же самое с Qt-3, используя QImage.loadFromData(). Я предполагаю, что это все еще работает в Qt-4:

self.image = QImage()
if self.image.loadFromData(image_data,"PNG"):
    # image loaded successfully
person Kaleb Pederson    schedule 15.06.2010
comment
Да, но моя программа не должна использовать подобные хаки, поскольку PIL ImageQt.ImageQt правильно (?) преобразует изображение в QImage, я должен иметь возможность отображать его напрямую! Я не знаю, почему он отображается как белый прямоугольник. - person oulipo; 15.06.2010
comment
loadFromData возвращает логическое значение, указывающее на успех или неудачу, и позволяет указать формат изображения. Таким образом, это дает вам дополнительное понимание того, почему он терпит неудачу. Если изображение правильно загружается, нет веской причины, по которой оно должно отображаться правильно в одном случае, а не в другом. В идеале ImageQt даст вам действительный QImage. - person Kaleb Pederson; 15.06.2010