将numpy数组转换为PySide QPixmap

时间:2012-03-20 20:01:03

标签: python numpy pyside

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

4 个答案:

答案 0 :(得分: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()

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

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

  

类PySide.QtGui.QImage(数据,宽度,高度,格式)

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

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

答案 1 :(得分: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)

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

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

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

答案 2 :(得分:4)

除了@ user545424关于使用PIL的答案,如果你不想依赖PIL,你可以直接从你的np数组手动构建你的Image:

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)

我敢肯定,使用PIL,有一种方法可以将实际的图像数据读入QImage,但是我会让@ user545424解决那个部分,因为它来自他的回答。 PIL附带ImageQt模块,方便直接转换图像 - &gt; QPixmap,但遗憾的是这是一个PyQt4 QPixmap,对你没用。

答案 3 :(得分:0)

如果user545424的答案未如预期的那样工作:您在图像中看到了伪像,那么我建议您将参数更改为

PySide.QtGui.QImage.Format_ A RGB32

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