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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top