2009-11-14 15 views
8

Tengo una imagen en una QImage y quiero procesarla en PIL antes de que la muestre. Si bien la clase ImageQT me permite convertir una imagen PIL en una QImage, no parece haber nada que vaya desde una QImage a una PIL Image.Convertir PyQt en imagen PIL

Respuesta

10

que convertirlo de QImage a PIL con este código:

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) 

He intentado muchas combinaciones antes de conseguir que funcione.

+0

Esto también funciona en Python3, simplemente cambie "cStringIO.StringIO" a "io.BytesIO". – mzuther

0

puede convertir un QImage en una cadena de Python:

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

la conversión de éste al PIL debe ser fácil.

+0

No creo que los datos de imagen directos sean compatibles entre las imágenes QImage y PIL. Lo que descubrí después de algunos problemas (me mordió): Qt alinea todas sus líneas en 32 bits, lo que significa que si el número de bytes por línea para la imagen no es divisible por 4, habrá una porquería insertada en los datos. Quizás haya aún más problemas ... –

2

Otra ruta sería:

  1. carga los datos de imagen en una matriz numpy (example code usando PIL)
  2. manipular la imagen usando numpy, scipy o scikits.image
  3. cargar los datos en una QImage (ejemplo: explorar el archivo scikits.image (vinculado en 1) y buscar en la línea 45 de qt_plugin.py - lo siento, stackoverflow no me permite publicar más enlaces aún)

Como Virgil menciona que los datos deben estar alineados a 32 bits (o 4 bytes), lo que significa que debe recordar especificar los pasos en el paso 3 (como se muestra en el fragmento).

+0

¿Puedes agregar el otro enlace todavía? (De vuelta cuando tuve ese problema, acabo de publicar otra respuesta para mantener el segundo enlace ;-) – SamB

+0

Claro, aquí está: 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() 

Gracias, Eli Bendersky, su código fue útil.

+0

Olvidaste agregar cuatro espacios antes de cada línea de código (y poner solo una nueva línea entre líneas). – 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() 
Cuestiones relacionadas