[Numpy-discussion] PyArray_BASE equivalent in python

Robert Kern robert.kern at gmail.com
Wed Nov 27 09:22:57 EST 2013


On Wed, Nov 27, 2013 at 2:16 PM, Peter Rennert <p.rennert at cs.ucl.ac.uk>
wrote:

> As a solution I have done something similar as it was proposed earlier,
> just that I derived from ndarray and kept the QImage reference it it:
>
> from PySide import QtGui as _qt
> import numpy as _np
>
> class MemoryTie(np.ndarray):
>      def __new__(cls, image):
>          # Retrieving parameters for _np.ndarray()
>          dims = [image.height(), image.width()]
>
>          strides = [[] for i in range(2)]
>          strides[0] = image.bytesPerLine()
>
>          bits = image.bits()
>
>          if image.format() == _qt.QImage.Format_Indexed8:
>              dtype = _np.uint8
>              strides[1] = 1
>          elif image.format() == _qt.QImage.Format_RGB32 \
>          or image.format() == _qt.QImage.Format_ARGB32 \
>          or image.format() == _qt.QImage.Format_ARGB32_Premultiplied:
>              dtype = _np.uint32
>              strides[1] = 4
>          elif image.format() == _qt.QImage.Format_Invalid:
>              raise ValueError("qimageview got invalid QImage")
>          else:
>              raise ValueError("qimageview can only handle 8- or 32-bit
> QImages")
>
>          # creation of ndarray
>          obj = _np.ndarray(dims, _np.uint32, bits, 0, strides,
> 'C').view(cls)
>          obj._image = image
>
>          return obj

Don't do that. Use my recipe. You don't really want your RGBA tuples
interpreted as uint32s, do you?

from PySide import QtGui
import numpy as np


class QImageArray(object):
    def __init__(self, qimage):
        shape = (qimage.height(), qimage.width(), -1)
        # Generate an ndarray from the image bits and steal its
        # __array_interface__ information.
        arr = np.frombuffer(qimage.bits(), dtype=np.uint8).reshape(shape)
        self.__array_interface__ = arr.__array_interface__
        # Keep the QImage alive.
        self.qimage = qimage

def qimage2ndarray(qimage):
    return np.asarray(QImageArray(qimage))

qimage =
QtGui.QImage('/Users/rkern/git/scipy/scipy/misc/tests/data/icon.png')
arr = qimage2ndarray(qimage)
del qimage
print arr

--
Robert Kern
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20131127/d0a1cec9/attachment.html>


More information about the NumPy-Discussion mailing list