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?

16
demandé sur AntonS 2012-03-21 00:01:03

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.

12
répondu user545424 2012-03-22 20:41:40

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.

10
répondu pwuertz 2012-04-04 16:36:57

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.

4
répondu jdi 2012-03-21 01:02:12