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