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所以我没有测试过这个.它可能无法正常工作,但它可能会指导您朝着正确的方向发展.
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.
| 归档时间: |
|
| 查看次数: |
14248 次 |
| 最近记录: |