Here is a function I wrote for some hobby project a while ago...
import copy
import numpy as np
def qt_image_to_array(img, share_memory=False):
""" Creates a numpy array from a QImage.
If share_memory is True, the numpy array and the QImage is shared.
Be careful: make sure the numpy array is destroyed before the image,
otherwise the array will point to unreserved memory!!
"""
assert isinstance(img, QtGui.QImage), "img must be a QtGui.QImage object"
assert img.format() == QtGui.QImage.Format.Format_RGB32, \
"img format must be QImage.Format.Format_RGB32, got: {}".format(img.format())
img_size = img.size()
buffer = img.constBits()
# Sanity check
n_bits_buffer = len(buffer) * 8
n_bits_image = img_size.width() * img_size.height() * img.depth()
assert n_bits_buffer == n_bits_image, \
"size mismatch: {} != {}".format(n_bits_buffer, n_bits_image)
assert img.depth() == 32, "unexpected image depth: {}".format(img.depth())
# Note the different width height parameter order!
arr = np.ndarray(shape = (img_size.height(), img_size.width(), img.depth()//8),
buffer = buffer,
dtype = np.uint8)
if share_memory:
return arr
else:
return copy.deepcopy(arr)