2010-06-14 92 views
2

我正在嘗試編寫一個小圖形應用程序,並且我需要使用PIL構建一些圖像,並在小部件中顯示。 圖像被正確構建(我可以檢查im.show()), 我可以將其轉換爲QImage,我可以正常保存到磁盤 (使用QImage.save),但如果我嘗試直接繪製它在我的 QWidget上,它只顯示一個白色方塊。使用PIL和PyQt在小部件上繪製QImage時出現問題

這裏我評論指出,不工作(轉換 圖像分成QImage的則的QPixmap導致白色正方形)的代碼,以及我 製成的骯髒的黑客將圖像保存到臨時文件並直接加載它 在QPixmap就其工作,但不是我想要做的

https://gist.github.com/f6d479f286ad75bf72b7

有人有想法?

如果它能幫助,當我試圖救我在QImage的BMP文件,我可以訪問其內容,但如果我嘗試將其保存爲PNG它完全是白色

回答

4

有同樣的問題,然後發現,這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_()) 
1

我已經做了與Qt-3使用QImage.loadFromData()一樣的東西。我想它仍然工作在Qt的4:

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

是的,但我的計劃不應該使用像這樣的黑客,因爲PIL ImageQt.ImageQt正確地(?)將圖像轉換爲QImage,我應該能夠直接顯示它!我不知道它爲什麼顯示爲 作爲白色矩形。 – oulipo 2010-06-15 09:26:57

+0

'loadFromData'返回一個bool指示成功或失敗,並允許您指定圖像格式。因此,它可以讓你進一步瞭解它失敗的原因。如果圖像正確加載,則沒有正確的理由在一種情況下顯示,但在另一種情況下不能顯示。理想的'ImageQt'會給你一個有效的'QImage'。 – 2010-06-15 14:30:23