Convertir num PY array en PySide QPixmap
je veux convertir une image dans un tableau de NumPy en PySide QPixmap, donc je peux l'afficher (EDIT: dans mon interface utilisateur de PySide). J'ai déjà trouvé cet outil: qimage2ndarray<!-Mais ça ne marche que pour PyQt4. J'ai essayé de le modifier pour qu'il fonctionne avec PySide, mais je dois changer la partie C de l'outil et je n'ai aucune expérience avec C. Comment puis-je faire ou y at-il des alternatives?
3 réponses
une alternative est d'utiliser simplement la bibliothèque PIL.
>>> import numpy as np
>>> import Image
>>> im = Image.fromarray(np.random.randint(0,256,size=(100,100,3)).astype(np.uint8))
>>> im.show()
vous pouvez regarder le constructeur QPixmap à http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html.
Il semble que vous devriez être en mesure d'utiliser un tableau numpy directement dans le constructeur:
classe PySide.QtGui.QImage(données, la largeur, la hauteur, format)
d'où l'argument format est l'un de ces: http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format.
alors, par exemple, vous pouvez faire quelque chose comme:
>>> a = np.random.randint(0,256,size=(100,100,3)).astype(np.uint32)
>>> b = (255 << 24 | a[:,:,0] << 16 | a[:,:,1] << 8 | a[:,:,2]).flatten() # pack RGB values
>>> im = PySide.QtGui.QImage(b, 100, 100, PySide.QtGui.QImage.Format_RGB32)
Je n'ai pas PySide installé donc je n'ai pas testé ceci. Il y a des Chances que ça ne fonctionne pas comme ça, mais ça pourrait vous guider dans la bonne direction.
si vous créez les données vous-même, en utilisant numpy par exemple, je pense que la méthode la plus rapide est d'accéder directement à un QImage. Vous pouvez créer un ndarray à partir de L'objet tampon QImage.bits (), faites du travail en utilisant les méthodes numpy et créez un QPixmap à partir de QImage lorsque vous avez terminé. Vous pouvez également lire ou modifier les QImages existants de cette façon.
import numpy as np
from PySide.QtGui import QImage
img = QImage(30, 30, QImage.Format_RGB32)
imgarr = np.ndarray(shape=(30,30), dtype=np.uint32, buffer=img.bits())
# qt write, numpy read
img.setPixel(0, 0, 5)
print "%x" % imgarr[0,0]
# numpy write, qt read
imgarr[0,1] = 0xff000006
print "%x" % img.pixel(1,0)
assurez-vous que le tableau ne survit pas à l'objet image. Si vous voulez, vous pouvez utiliser un dtype plus sophistiqué, comme un tableau d'enregistrement pour accès individuel aux bits alpha, rouge, vert et bleu (attention à l'endianess).
dans le cas où il n'y a aucun moyen efficace de calculer les valeurs des pixels en utilisant numpy, vous pouvez également utiliser scipy.tissage aux commandes de certains C/C++ code qui fonctionne sur le tableau img.(bits) points.
si vous avez déjà une image au format ARGB, créer le QImage à partir de données comme suggéré précédemment est probablement plus facile.
en plus de la réponse de @user545424 à propos de L'utilisation de PIL, si vous ne vouliez pas dépendre de PIL, vous pourriez construire manuellement votre Image directement à partir de votre tableau np:
width = 100
height = 100
data = np.random.randint(0,256,size=(width,height,3)).astype(np.uint8)
img = QtGui.QImage(width, height, QtGui.QImage.Format_RGB32)
for x in xrange(width):
for y in xrange(height):
img.setPixel(x, y, QtGui.QColor(*data[x][y]).rgb())
pix = QtGui.QPixmap.fromImage(img)
je suis sûr, en utilisant PIL, qu'il y a un moyen de lire les données d'image réelles dans un QImage, mais je vais laisser @user545424 s'adresser à cette partie depuis sa réponse. PIL est livré avec le module ImageQt qui est pratique pour convertir directement une Image - > QPixmap, mais malheureusement c'est un PyQt4 QPixmap, qui ne vous aide pas.