Question

Je suis en train d'écrire un programme en utilisant PyQt4 GUI front-end et ce programme accède à une base de données back-end (qui peut être MySQL ou SQLite). J'ai besoin de stocker des données d'image dans la base de données et au-dessous est le code Python que j'utilise pour importer des fichiers d'images (au format JPEG) à un champ de données blob dans la base de données:

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

Cette partie fonctionne très bien. Ma question porte sur la façon de créer un objet QPixmap à partir des données d'images stockées dans la base de données PyQt4. Mon approche actuelle comprend les étapes suivantes:

(1) Hex str dans la base de données - cPickle & StringIO -> PIL objet image

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 objet image -> fichier image temporaire

(3) fichier image temporaire -> QPixmap

Cette approche fonctionne aussi bien. Mais ce serait mieux si je ne dois pas écrire / lire les fichiers image temporaires qui peuvent ralentir la réponse du programme aux interactions des utilisateurs. Je suppose que je pourrais utiliser QPixmap :: loadFromData () directement charge à partir des données de blob stockées dans la base de données et nous espérons que quelqu'un ici pourrait me montrer un exemple sur la façon d'utiliser cette fonction.

TIA,

Bing

Était-ce utile?

La solution

Vous pouvez utiliser la méthode statique QImage.fromData pour charger une image à partir d'une chaîne, puis le convertir en un pixmap:

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

Autres conseils

L'approche suggérée par les fourmis Aasma fonctionne et en fait, il est correct aussi d'utiliser simplement le code suivant:

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

Merci beaucoup pour toute l'aide et des informations.

Après une bonne heure et demie de googleing pour résoudre un problème similaire, j'ai fini par chargement de fichiers JPEG dans un .exe compilé avec QT. J'utilise python3.1, et ne pouvait donc utiliser certaines des solutions mentionnées précédemment:

  • Conseils de travail pour py2exe (parce que je me sers cxfreeze au lieu de py2exe, comme py2exe ne fonctionne que pour python2),
  • des conseils qui nécessitent PIL (aussi seulement pour python2, autant que je sache).

Alors que les solutions affichées ici ne fonctionnent pas, quelque chose de très similaire fait: J'ai simplement copié le [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats dans le dossier de mon exe et supprimé le fichier qt.conf que j'ai créé dans ce dossier suivant d'autres solutions. C'est tout (je pense: p).

Après cela, il a travaillé si je chargé le jpg en utilisant le constructeur de QPixmap ou le chargement d'un QImage premier. Il a également travaillé sans option spéciale nécessaire tant pour le setup.py et les méthodes de cxfreeze.bat de compilation exe en utilisant cxfreeze.

(cette solution a été publiée par JBZ sur http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously- i-dont-sais-quoi-to-do-with-you-quand-vous êtes-comme-ce / )

Cette question est un peu vieux, mais comme le problème semble être toujours là, je l'espère, cette réponse aidera les utilisateurs de python3.1 là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top