将numpy数组转换为PySide QPixmap

Ant*_*onS 17 python numpy pyside

我想将图像转换为NumPy数组到PySide QPixmap,所以我可以显示它(编辑:在我的PySide UI中).我已经找到了这个工具:qimage2ndarray,但它只适用于PyQt4.我试图改变它以使它与PySide一起工作,但是我将不得不改变工具的C部分而我没有C的经验.我怎么能这样做或者有其他选择吗?

use*_*424 12

另一种方法是使用PIL库.

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

您可以在http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html上查看QPixmap构造函数.

看起来你应该能够在构造函数中直接使用numpy数组:

class PySide.QtGui.QImage(data,width,height,format)

其中format参数是以下之一:http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format.

所以,举例来说你可以这样做:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

我没有安装PySide所以我没有测试过这个.它可能无法正常工作,但它可能会指导您朝着正确的方向发展.

  • 在这里发布了一个单独的问题并得到了很好的解释。不过还是谢谢!http://stackoverflow.com/questions/27872239/why-is-there-bit-shifting-when-converting-to-an-image-from-an-array (2认同)

pwu*_*rtz 10

如果您自己创建数据,例如使用numpy,我认为最快的方法是直接访问QImage.你可以从缓冲区对象QImage.bits()创建一个ndarray,使用numpy方法做一些工作,并在完成后从QImage创建一个QPixmap.您也可以通过这种方式阅读或修改现有的QImages.

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)
Run Code Online (Sandbox Code Playgroud)

确保数组不会超过图像对象.如果你愿意,你可以使用一个更复杂的dtype,比如一个记录数组,可以单独访问alpha,red,green和blue位(但要注意endianess).

如果没有使用numpy计算像素值的有效方法,您还可以使用scipy.weave内联一些在img.bits()指向的数组上运行的C/C++代码.

如果您已经有ARGB格式的图像,则可能更容易从之前建议的数据创建QImage.