dati immagine carico blob in QPixmap
Domanda
Sto scrivendo un programma che utilizza PyQt4 per GUI front-end e questo programma accede a un database di back-end (che può essere sia MySQL o SQLite). Ho bisogno di memorizzare alcuni dati di immagine nel database e di seguito è il codice Python che uso per importare file di immagini (in formato JPEG) per un campo di dati BLOB nel database:
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
Questa parte funziona bene. La mia domanda è su come creare un oggetto QPixmap dai dati di immagine memorizzati nel database in PyQt4. Il mio approccio attuale prevede le seguenti fasi:
(1) Hex str nel database - cPickle & StringIO -> PIL Immagine Oggetto
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 Immagine Oggetto -> file immagine temporanei
(3) file immagine temporaneo -> QPixmap
Questo approccio funziona anche bene. Ma sarebbe meglio se io non devo scrivere / leggere i file di immagine temporanei che possono rallentare la risposta del programma di interazioni degli utenti. Credo che avrei potuto utilizzare QPixmap :: loadFromData () per diretta carico dai dati blob memorizzati nel database e spero che qualcuno qui mi potrebbe mostrare un esempio su come utilizzare questa funzione.
TIA,
Bing
Soluzione
È possibile utilizzare il metodo statico QImage.fromData per caricare un'immagine da una stringa e quindi convertirlo in una pixmap:
image_data = get_image_data_from_blob()
qimg = QtGui.QImage.fromData(image_data)
pixmap = QtGui.QPixmap.fromImage(qimg)
Altri suggerimenti
L'approccio suggerito da formiche Aasma funziona e in realtà è anche OK per utilizzare solo il seguente codice:
image_data = cPickle.loads(str(s)) # s is fetched from DB
qp = QPixmap()
qp.loadFromData(image_data)
Grazie mille per tutto l'aiuto e informazioni.
Dopo una buona ora e mezza di googleing per risolvere un problema simile, ho finito per JPEG loading in un exe compilato con QT. Sto usando python3.1, e quindi non potevo usare alcune delle soluzioni precedentemente menzionate:
- suggerimenti che lavorano per py2exe (perché sto usando cxfreeze invece di py2exe, come py2exe funziona solo per python2),
- suggerimenti che richiedono PIL (anche solo per python2, per quanto ne so).
Mentre le soluzioni postato qui non ha funzionato, ha fatto qualcosa di molto simile:
Ho semplicemente copiato il [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats
nella cartella di mio exe e rimosso il file qt.conf
che ho creato in quella cartella in seguito altre soluzioni. Questo è tutto (credo: p).
Dopo di che, ha funzionato se ho caricato il jpg utilizzando il costruttore del QPixmap
o il caricamento di un QImage
prima. Ha inoltre lavorato con nessuna opzione speciale stato necessario sia per il setup.py
ei metodi di compilazione cxfreeze.bat
exe utilizzando cxfreeze.
(questa soluzione è stato pubblicato da JBZ su http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously- i-dont-sai-cosa-to-do-con-you-quando-sei-come-questo / )
Questa domanda è un po 'vecchio, ma come il problema sembra essere ancora là, spero che questa risposta aiuterà gli utenti python3.1 là fuori.