Как получить доступ к пиксельным данным с помощью PYQt QImage scanline()

Мне нужно получить доступ к данным пикселей в объекте qimage с помощью PyQt4.

.pixel() работает слишком медленно, поэтому в документации рекомендуется использовать метод scanline().

В С++ я могу получить указатель, возвращаемый методом scanline(), и прочитать/записать значение RGB пикселя из буфера.

С Python я получаю объект SIP voidptr, который указывает на буфер пикселей, поэтому я могу только прочитать значение RGB пикселя, используя bytearray, но я не могу изменить значение в исходном указателе.

Какие-либо предложения?


person risinglf    schedule 06.07.2012    source источник


Ответы (1)


Вот некоторые примеры:

from PyQt4 import QtGui, QtCore
img = QtGui.QImage(100, 100, QtGui.QImage.Format_ARGB32)
img.fill(0xdeadbeef)

ptr = img.bits()
ptr.setsize(img.byteCount())

## copy the data out as a string
strData = ptr.asstring()

## get a read-only buffer to access the data
buf = buffer(ptr, 0, img.byteCount())

## view the data as a read-only numpy array
import numpy as np
arr = np.frombuffer(buf, dtype=np.ubyte).reshape(img.height(), img.width(), 4)

## view the data as a writable numpy array
arr = np.asarray(ptr).reshape(img.height(), img.width(), 4)
person Luke    schedule 09.07.2012
comment
Хороший вопрос; добавил еще один ответ в список. - person Luke; 07.09.2012
comment
Чувак, ты не представляешь, как долго я гуглил, как это сделать. Огромное спасибо. Стоит сказать, что последняя строка создает представление, а не копию данных. Если кто-то хочет создать копию QImage, вызовите .copy() для массива. Плюс следите за форматом. Мне нужно было получить RGB, таким образом, вызов чего-то вроде arr[:, :, [0, 2]] = arr[:, :, [2, 0]] помог - person Alexander Serikov; 17.03.2019