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
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.
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.
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 ... –
Otra ruta sería:
- carga los datos de imagen en una matriz numpy (example code usando PIL)
- manipular la imagen usando numpy, scipy o scikits.image
- 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).
¿Puedes agregar el otro enlace todavía? (De vuelta cuando tuve ese problema, acabo de publicar otra respuesta para mantener el segundo enlace ;-) – SamB
Claro, aquí está: https://github.com/stefanv/scikits.image/blob/master/scikits/image/ io/_plugins/qt_plugin.py # L45 –
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.
Olvidaste agregar cuatro espacios antes de cada línea de código (y poner solo una nueva línea entre líneas). – SamB
#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()
- 1. Convertir una imagen de UploadedFile a PIL en Django
- 2. Cómo convertir matriz Numpy a imagen PIL aplicando matplotlib colormap
- 3. Convertir la imagen de PIL a GTK Pixbuf
- 4. Usando python PIL para convertir una imagen RGB en una imagen pura en blanco y negro
- 5. NumPy, PIL agregando una imagen
- 6. PIL - Convertir Marcos GIF a JPG
- 7. Recortar la imagen usando PIL en python
- 8. Convertir imagen en una matriz en python
- 9. PyQt: ¿Cómo visualizo una imagen correctamente?
- 10. Contorno de imagen usando python/PIL
- 11. Copiando región de imagen triangular con PIL
- 12. miniatura PIL está girando mi imagen?
- 13. Python PIL, imagen. Error después de image.load()
- 14. Python PIL no tiene ningún atributo 'Imagen'
- 15. PIL modo de imagen "P" -> "RGBA"
- 16. PIL: ¿Convertir imagen RGB a una paleta específica de 8 bits?
- 17. PIL Convertir PNG o GIF con transparencia a JPG sin
- 18. Conversión de PIL GdkPixbuf
- 19. Copia de Python en el objeto de imagen PIL
- 20. Cargue un lienzo html5 en una imagen PIL con Django
- 21. Python PIL: cómo escribir una imagen PNG en la cadena
- 22. imagen PIL en memoria para volver de aplicación WSGI
- 23. python PIL dibujar texto multilínea en la imagen
- 24. Fusión de fondo con imagen transparente en PIL
- 25. error al abrir archivo de imagen en PIL
- 26. Cómo construir un objeto de imagen en PIL/Python
- 27. Ajustar texto en PIL
- 28. ¿Cómo se compone una imagen en otra imagen con PIL en Python?
- 29. Convertir imagen en texto - Java
- 30. Convertir página web en imagen
Esto también funciona en Python3, simplemente cambie "cStringIO.StringIO" a "io.BytesIO". – mzuther