11
votes

Convertir Pyqt en Image Pil

J'ai une image dans un QIMAGE et je veux le traiter à PIL avant de l'afficher. Alors que la classe Imageqt me permet de convertir une image de Pil en qimage, il n'y a rien à passer d'un QIMAGE à une image PIL.


0 commentaires

6 Réponses :


0
votes

Vous pouvez convertir un QIMAGE en une chaîne Python:

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


1 commentaires

Je ne pense pas que les données d'image directe sont compatibles entre les images QImage et PIL. Ce que j'ai découvert après quelques gâchés (ça m'a mordus): Qt aligne toutes ses lignes sur 32 bits, ce qui signifie que si le nombre d'octets par ligne d'image n'est pas divisible par 4, il y aura une merde insérée dans les données. Peut-être qu'il y a encore plus de gotchas ...



13
votes

Je le convertit de Qimage en Pil avec ce 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)


2 commentaires

Cela fonctionne également dans Python3, change simplement "cstringio.stringio" à "io.bytesio".


Pour Pyside2 5.x , buffer.data () renvoie un qbytearray . Si vous appelez data () sur le qbytearray cela devrait vous donner ce que vous voulez. Soyez prudent des canaux de couleur si vous utilisez numpy .



2
votes

Un autre itinéraire serait:

  1. chargez les données d'image dans une matrice numpue ( Exemple de code à l'aide de PIL)
  2. manipuler l'image à l'aide de NUMPY, SCIPY ou SCIKITS.IMAGE
  3. Chargez les données dans un QIMAGE (Exemple: parcourir les scikits.Image Archive (liée à 1) et regardez la ligne 45 de qt_plugin.py - Désolé, Stackoverflow ne me permet pas de poster plus de liens)

    Comme Virgil mentionne, les données doivent être alignées de 32 bits (ou de 4 octets), ce qui signifie que vous devez vous rappeler de spécifier les progrès à l'étape 3 (comme indiqué dans l'extrait).


2 commentaires

Pouvez-vous ajouter l'autre lien encore? (Retour quand j'ai eu ce problème, je viens de poster une autre réponse pour tenir le deuxième lien ;-)


Bien sûr, voici: github.com/stefanv/scikits.image/blob/master/scikits/image/i o / ...



2
votes
from PyQt4 import QtGui
from PIL import Image

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

1 commentaires

Vous avez oublié d'ajouter quatre espaces avant chaque ligne de code (et ne placez qu'une nouvelle ligne entre les lignes).



2
votes
#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()

0 commentaires

0
votes

Voici une réponse pour ceux utilisant Pyside2 5.x , les emballages officiels Python pour qt. Ils doivent également travailler pour pyqt 5.x

J'ai également ajouté à qimage à numpy que j'ai utilisé conjointement avec celui-ci . Je préfère utiliser la dépendance PIL , principalement parce que je n'ai pas à suivre les changements de canal de couleur. xxx

ici est un pour convertir numpy.ndarray à qimage xxx


0 commentaires