Convertir matriz numpy a PySide QPixmap

Quiero convertir una imagen en una matriz NumPy en un QPixmap de PySide, para poder mostrarla (EDITAR: en mi interfaz de usuario de PySide). Ya encontré esta herramienta: qimage2ndarray , pero solo funciona para PyQt4. Intenté cambiarlo para que funcione con PySide, pero tendría que cambiar la parte C de la herramienta y no tengo experiencia con C. ¿Cómo puedo hacer esto o hay alguna alternativa?

Related of "Convertir matriz numpy a PySide QPixmap"

Una alternativa es simplemente usar la biblioteca PIL.

>>> import numpy as np >>> import Image >>> im = Image.fromarray(np.random.randint(0,256,size=(100,100,3)).astype(np.uint8)) >>> im.show() 

Puede consultar el constructor de QPixmap en http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html .

Parece que deberías poder usar una matriz numpy directamente en el constructor:

clase PySide.QtGui.QImage (datos, ancho, alto, formato)

donde el argumento de formato es uno de estos: http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format .

Entonces, por ejemplo, podrías hacer algo como:

 >>> 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) 

No tengo PySide instalado, así que no he probado esto. Es probable que no funcione como está, pero podría guiarlo en la dirección correcta.

Si crea los datos por su cuenta, por ejemplo, utilizando numpy, creo que el método más rápido es acceder directamente a una QImage. Puede crear una ndarray desde el objeto de búfer QImage.bits (), hacer un trabajo usando los métodos numpy y crear un QPixmap desde QImage cuando haya terminado. También puede leer o modificar QImages existentes de esa manera.

 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) 

Asegúrese de que la matriz no sobreviva al objeto de imagen. Si lo desea, puede usar un dtype más sofisticado, como una matriz de grabación para el acceso individual a los bits alfa, rojo, verde y azul (aunque tenga cuidado con la endianess).

En caso de que no haya una forma eficiente de calcular los valores de píxel utilizando numpy, también puede usar scipy.weave para insertar algún código C / C ++ que funcione en la matriz a la que img.bits () apunta.

Si ya tiene una imagen en formato ARGB, probablemente sea más fácil crear la QImage a partir de los datos como se sugirió anteriormente.

Además de la respuesta de @ user545424 sobre el uso de PIL, si no desea depender de PIL, puede construir manualmente su imagen directamente desde su matriz 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) 

Estoy seguro de que, utilizando PIL, hay una manera de leer los datos de la imagen real en una QImage, pero dejaré que @ user545424 dirija esa parte desde su respuesta. PIL viene con el módulo ImageQt, que es conveniente para convertir directamente una imagen -> QPixmap, pero desafortunadamente es un QPixmap de PyQt4, que no te ayuda.