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)
如果您自己创建数据,例如使用numpy,我认为最快的方法是直接访问一个QImage。可以从缓冲区对象QImage.bits()创建ndarray,使用numpy方法执行一些工作,完成后从QImage创建QPixmap。您也可以通过这种方式读取或修改现有的QImages。
请确保数组不比图像对象活得长。如果需要,可以使用更复杂的数据类型,例如记录数组,用于单独访问alpha、red、green和blue位(但要注意endianess)。
如果没有使用NUMPY计算像素值的有效方法,那么也可以使用SyPy.WeaveIn将一些在数组IMG.BITSH()点上运行的C/C++代码内联到。
如果已经有了ARGB格式的图像,那么按照前面的建议从数据创建QImage可能更容易。
除了@user545424关于使用PIL的答案外,如果不想依赖PIL,可以直接从np数组中手动构造图像:
我确信,使用PIL,有一种方法可以将实际的图像数据读入到一个QImage中,但是我会让@user545424从他的答案中找到该部分的地址。PIL附带了ImageQt模块,可以方便地直接转换图像->;QPixmap,但不幸的是,这是一个PyQt4 QPixmap,对您没有帮助。
另一种选择是使用PIL库。
您可以在http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html查看QPixmap构造函数。
看起来您应该能够在构造函数中直接使用numpy数组:
其中format参数是以下参数之一:http://www.pyside.org/docs/pyside/PySide/QtGui/QImage.html#PySide.QtGui.PySide.QtGui.QImage.Format。
例如,你可以这样做:
我没有安装PySide所以我没有测试过。很有可能它不会按原样工作,但它可能会指引你朝着正确的方向前进。
相关问题 更多 >
编程相关推荐