2009-08-19 5 views
4

Ich schreibe ein Programm mit PyQt4 für Front-End-GUI und dieses Programm greift auf eine Back-End-Datenbank (die entweder MySQL oder SQLite sein kann). Ich brauche ein paar Bilddaten in der Datenbank zu speichern und unten ist der Python-Code I-Bilddateien zu importieren, verwenden (im JPEG-Format) zu einem Blob-Datenfeld in der Datenbank:Load Blob Bilddaten in 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 

Dieser Teil funktioniert gut. Meine Frage betrifft das Erstellen eines QPixmap-Objekts aus den Bilddaten, die in PyQt4 in der Datenbank gespeichert sind. Mein aktueller Ansatz beinhaltet die folgenden Schritte:

(1) Hex str in Datenbank - cPickle & StringIO -> PIL Bildobjekt

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 Bildobjekt -> Temporäre Bilddatei

(3) Temporäre Bilddatei -> QPixmap

Dieser Ansatz funktioniert auch gut. Aber es wäre besser, wenn ich keine temporären Bilddateien schreiben/lesen müsste, die die Reaktion des Programms auf Benutzerinteraktionen verlangsamen könnten. Ich denke, ich könnte QPixmap::loadFromData() verwenden, um direkt von den in der Datenbank gespeicherten Blobdaten zu laden und hoffe, dass jemand hier ein Beispiel zeigen könnte, wie man diese Funktion benutzt.

TIA,

Bing

+0

Warum verwenden Sie sogar den PIL-Schritt? Qt ist glücklich mit dem Laden von JPEG-Daten: http://docs.huihoo.com/pyqt/pyqt4/html/qpixmap.html#reading-and-writing-image-files – balpha

+0

Ich bin sicher, dass Qt JPEG-Daten laden kann. Was ich suche, ist ein Code-Snippet, das die im Blob-Feld codierte Zeichenfolge in das QPixmap-Objekt konvertiert. Vielen Dank! –

+0

Ich habe herausgefunden, dass ich nur QPixmap :: loadFromData (cPickle.loads (s)) verwenden kann, wobei s die aus dem BLOB-Feld abgerufene Zeichenfolge ist. Danke für die Hilfe. –

Antwort

8

Sie die QImage.fromData statische Methode verwenden können, um ein Bild aus einer Zeichenfolge zu laden und es dann zu einem pixmap konvertieren:

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

Der Ansatz vorgeschlagen durch Ameisen Aasma funktioniert und eigentlich ist es auch OK, nur den folgenden Code zu verwenden:

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

Vielen Dank für die Hilfe und Informationen.

0

Nach gut anderthalb Stunden googeln, um ein ähnliches Problem zu lösen, landete ich Laden JPEGs in einer kompilierten .exe mit QT. Ich bin mit python3.1 und damit nicht einige der zuvor genannten Lösungen verwenden:

  • Spitzen arbeiten für py2exe (weil ich cxfreeze verwende statt py2exe, wie py2exe nur für python2 arbeitet),
  • Tipps, die PIL benötigen (auch nur für python2, afaik).

Während die hier gepostet Lösungen funktionierten nicht, etwas sehr ähnlich war: ich die [PythonDir]\Lib\site-packages\PyQt4\plugins\imageformats meiner exe Ordner einfach kopiert und entfernt die qt.conf Datei, die ich in diesem Ordner folgende andere Lösungen erstellt. Das ist alles (ich denke: p).

Danach funktionierte es, ob ich das JPG mit QPixmap 's Konstruktor geladen oder zuerst eine QImage geladen habe. Es funktionierte auch ohne spezielle Option sowohl für die setup.py als auch die cxfreeze.bat Methoden zum Kompilieren von exe mit cxfreeze.

Diese Frage ist ein bisschen alt, aber da das Problem noch zu sein scheint, gibt (diese Lösung von JBZ auf http://www.thetoryparty.com/wp/2009/08/27/pyqt-and-py2app-seriously-i-dont-know-what-to-do-with-you-when-youre-like-this/ geschrieben wurde), ich hoffe, diese Antwort python3.1 Nutzer da draußen helfen.