将numpy数组转换为PySide QPixmap

2024-09-30 00:25:08 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 工具图像numpy编辑ui数组经验pyside
3条回答

如果您自己创建数据,例如使用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)

请确保数组不比图像对象活得长。如果需要,可以使用更复杂的数据类型,例如记录数组,用于单独访问alpha、red、green和blue位(但要注意endianess)。

如果没有使用NUMPY计算像素值的有效方法,那么也可以使用SyPy.WeaveIn将一些在数组IMG.BITSH()点上运行的C/C++代码内联到。

如果已经有了ARGB格式的图像,那么按照前面的建议从数据创建QImage可能更容易。

除了@user545424关于使用PIL的答案外,如果不想依赖PIL,可以直接从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)

我确信,使用PIL,有一种方法可以将实际的图像数据读入到一个QImage中,但是我会让@user545424从他的答案中找到该部分的地址。PIL附带了ImageQt模块,可以方便地直接转换图像->;QPixmap,但不幸的是,这是一个PyQt4 QPixmap,对您没有帮助。

另一种选择是使用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数组:

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)

我没有安装PySide所以我没有测试过。很有可能它不会按原样工作,但它可能会指引你朝着正确的方向前进。

相关问题 更多 >

    热门问题