Frage

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:

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 ist, wie man ein QPixmap Objekt aus den Bilddaten in der Datenbank in PyQt4 gespeichert zu erstellen. 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) Vorübergehende Bilddatei -> QPixmap

Dieser Ansatz funktioniert auch gut. Aber es wäre besser, wenn ich muss das Programm als Reaktion auf Benutzer-Interaktionen nicht schreiben / lesen temporäre Bilddateien, die verlangsamen kann nach unten. Ich glaube, ich könnte verwenden QPixmap :: loadFromData () direkt an Last von den Blob-Daten in der Datenbank gespeichert und hofft, dass hier jemand mir ein Beispiel, wie man zeigen könnte, diese Funktion nutzen.

TIA,

Bing

War es hilfreich?

Lösung

Sie können die QImage.fromData statische Methode verwenden, 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)

Andere Tipps

Der Ansatz von Ameisen Aasma vorgeschlagen funktioniert und eigentlich ist es auch in Ordnung, 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 all die Hilfe und Informationen.

Nach einer guten Stunde und eine Hälfte von googleing 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:

  • Tipps für py2exe arbeiten (weil ich verwende cxfreeze statt py2exe, wie py2exe nur für python2 funktioniert),
  • Tipps, die PIL erfordern (auch nur für python2, afaik).

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

Danach war es, ob ich den jpg mit QPixmap Konstruktor geladen oder ein QImage ersten Laden. Es funktionierte auch ohne spezielle Option für erforderlich sowohl die setup.py und die cxfreeze.bat Methoden der Kompilierung mit cxfreeze exe.

(diese Lösung wurde durch 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 / )

Diese Frage ist ein bisschen alt, aber da das Problem ist immer noch da zu sein scheint, ich hoffe, diese Antwort python3.1 Nutzer da draußen helfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top