2009-11-14 19 views
8

Ich habe ein Bild in einem QImage und ich möchte es in PIL verarbeiten, bevor ich es anzeigen. Während die ImageQT-Klasse es mir erlaubt, ein PIL-Bild in ein QImage zu konvertieren, scheint nichts von einem QImage zu einem PIL-Bild zu gehen.Convert PyQt in PIL Bild

Antwort

10

ich wandeln es von QImage zu PIL mit diesem Code:

img = QImage("/tmp/example.png") 
buffer = QBuffer() 
buffer.open(QIODevice.ReadWrite) 
img.save(buffer, "PNG") 

strio = cStringIO.StringIO() 
strio.write(buffer.data()) 
buffer.close() 
strio.seek(0) 
pil_im = Image.open(strio) 

Ich habe versucht, viele Kombinationen, bevor man es arbeiten.

+0

Dies funktioniert auch in Python3, ändern Sie einfach "cStringIO.StringIO" in "io.BytesIO". – mzuther

0

Sie können eine QImage in einen Python-String konvertieren:

>>> image = QImage(256, 256, QImage.Format_ARGB32) 
>>> bytes = image.bits().asstring(image.numBytes()) 
>>> len(bytes) 
262144 

von diesem zu PIL Konvertierung sollte einfach sein.

+0

Ich glaube nicht, dass direkte Bilddaten kompatibel sind zwischen QImage und PIL Bilder. Was ich nach einigem Herumspielen herausgefunden habe (es hat mich gebissen): Qt richtet alle seine Zeilen auf 32 Bit aus, was bedeutet, dass, wenn die Anzahl der Bytes pro Zeile für Bild nicht durch 4 teilbar ist, Mist in die Daten eingefügt wird. Vielleicht gibt es noch mehr Probleme ... –

2

Ein anderer Weg wäre:

  1. Laden der Bilddaten in eine numpy array (example code PIL verwenden)
  2. das Bild unter Verwendung von Manipulieren numpy, scipy oder scikits.image
  3. laden die Daten in ein QImage (Beispiel: das scikits.image Archiv durchsuchen (verlinkt in 1) und schauen auf Linie 45 von qt_plugin.py - sorry, stackoverflow erlaubt mir nicht noch mehr Links zu posten)

Wie Virgil erwähnt, die Daten müssen 32-Bit (oder 4-Byte) ausgerichtet sein, was bedeutet, dass Sie daran denken müssen, die Schritte in Schritt 3 zu spezifizieren (wie im Schnipsel gezeigt).

+0

Können Sie den anderen Link noch hinzufügen? (Damals, als ich dieses Problem hatte, habe ich gerade eine andere Antwort gepostet, um den zweiten Link zu halten ;-) – SamB

+0

Sicher, hier ist es: https://github.com/stefanv/scikits.image/blob/master/scikits/image/ io/_plugins/qt_plugin.py # L45 –

1
from PyQt4 import QtGui, QtCore 
img = QtGui.QImage("greyScaleImage.png") 
bytes=img.bits().asstring(img.numBytes()) 
from PIL import Image 
pilimg = Image.frombuffer("L",(img.width(),img.height()),bytes,'raw', "L", 0, 1) 
pilimg.show() 

Danke Eli Bendersky, Ihr Code war hilfreich.

+0

Sie haben vergessen, vor jeder Codezeile vier Leerzeichen einzufügen (und nur einen Zeilenumbruch zwischen Zeilen). – SamB

1
#Code for converting grayscale QImage to PIL image 

from PyQt4 import QtGui, QtCore 
qimage1 = QtGui.QImage("t1.png") 
bytes=qimage1.bits().asstring(qimage1.numBytes()) 
from PIL import Image 
pilimg = Image.frombuffer("L",(qimage1.width(),qimage1.height()),bytes,'raw', "L", 0, 1) 
pilimg.show()