2009-08-19 39 views
4

我正在編寫一個使用PyQt4作爲前端GUI的程序,該程序訪問後端數據庫(可以是MySQL或SQLite)。我需要一些圖像數據存儲在數據庫中,下面是我使用的圖像文件(JPEG格式)導入到一個blob數據字段在數據庫中的Python代碼:將blob圖像數據加載到QPixmap中

def dump_image(imgfile): 
    i = open(imgfile, 'rb') 
    i.seek(0) 
    w = i.read() 
    i.close() 
    return cPickle.dumps(w,1) 

blob = dump_image(imgfile) 
hex_str = blob.encode('hex') 
# x"%s"%hex_str will be the string inserted into the SQL command 

這部分工作正常。我的問題是關於如何從PyQt4中存儲在數據庫中的圖像數據創建一個QPixmap對象。我的當前的方法涉及以下步驟:

(1)在數據庫六角STR - cPickle的& StringIO的 - > PIL圖像對象

def load_image(s): 
    o = cPickle.loads(s) 
    c = StringIO.StringIO() 
    c.write(o) 
    c.seek(0) 
    im = Image.open(c) 
    return im 

(2)PIL圖像對象 - >臨時圖像文件

(3)臨時圖像文件 - > QPixmap

此方法也可以正常工作。但是,如果我不必寫/讀臨時映像文件,這可能會減慢對用戶交互的程序響應,那將會更好。我想我可以使用QPixmap::loadFromData()直接從存儲在數據庫中的blob數據加載,並希望這裏的某個人能夠給我一個關於如何使用這個函數的例子。

TIA,

+0

爲什麼你甚至使用PIL步驟? Qt對加載JPEG數據非常滿意:http://docs.huihoo.com/pyqt/pyqt4/html/qpixmap.html#reading-and-writing-image-files – balpha 2009-08-19 16:00:36

+0

我相信Qt能夠加載JPEG數據。我在尋找的是一個代碼片段,它將在blob字段中編碼的字符串轉換爲QPixmap對象 。謝謝! – 2009-08-19 18:37:49

+0

我想通過使用QPixmap :: loadFromData(cPickle.loads(s)),其中s是從blob字段獲取的字符串數據。謝謝您的幫助。 – 2009-08-19 18:55:48

回答

8

可以使用QImage.fromData靜態方法從字符串加載圖像,然後將其轉換爲像素圖:

image_data = get_image_data_from_blob() 
qimg = QtGui.QImage.fromData(image_data) 
pixmap = QtGui.QPixmap.fromImage(qimg) 
2

的方法,通過建議螞蟻Aasma的作品,其實也可以使用下面的代碼:

image_data = cPickle.loads(str(s)) # s is fetched from DB 
qp = QPixmap() 
qp.loadFromData(image_data) 

非常感謝所有幫助和信息。

0

經過一個半小時的Googleing解決了類似的問題後,我最終用一個QT編譯的.exe加載了JPEG文件。我使用python3.1,因此不能使用一些前面提到的解決方案:

  • 提示py2exe工作(因爲我使用cxfreeze而不是py2exe,如py2exe只適用python2)
  • 需要PIL的提示(也僅適用於python2,afaik)。

雖然在此發佈的解決方案沒有工作,非常類似的東西做的: 我只是照抄[PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats我的exe文件的文件夾,刪除qt.conf文件,我該文件夾中下面的其他解決方案創建的。這就是全部(我認爲:p)。

之後,無論我使用QPixmap的構造函數加載jpg還是首先加載QImage,它都能正常工作。它也適用於setup.pycxfreeze.bat編譯爲使用cxfreeze執行exe文件所需的特殊選項。

(這個解決方案被張貼上JBZ http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/

這個問題是有點老了,但這個問題似乎仍然存在,我希望這個答案可以幫助用戶python3.1那裏。