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. P>
6 Réponses :
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
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 ...
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)
Cela fonctionne également dans Python3, change simplement "cstringio.stringio" à "io.bytesio".
Pour Pyside2 5.x code>,
buffer.data () code> renvoie un
qbytearray code>. Si vous appelez
data () code> sur le
qbytearray code> cela devrait vous donner ce que vous voulez. Soyez prudent des canaux de couleur si vous utilisez
numpy code>.
Un autre itinéraire serait: p>
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). P>
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 / ...
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()
Vous avez oublié d'ajouter quatre espaces avant chaque ligne de code (et ne placez qu'une nouvelle ligne entre les lignes).
#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()
Voici une réponse pour ceux utilisant J'ai également ajouté à ici est un pour convertir Pyside2 5.x Code>, les emballages officiels Python pour qt. Ils doivent également travailler pour
pyqt 5.x code>
qimage code> à
numpy code> que j'ai utilisé conjointement avec celui-ci . Je préfère utiliser la dépendance
PIL code>, principalement parce que je n'ai pas à suivre les changements de canal de couleur. P>
numpy.ndarray code> à
qimage code> p>