Решение, которое в итоге оказалось наиболее подходящим для меня, заключается в использовании класса ImageData
, который поставляется с каждым AbstractImage
подклассом.
Получение массива ImageData
Класс ImageData
представляет изображение в виде массива байтов или, точнее, строки, каждый символ которой представляет координату в требуемом цветовом пространстве.
Чтобы получить этопредставление байта данного image
, вы бы назвали
image_data = image.get_image_data()
width = image_data.width
data = image_data.get_data('RGB', 3*width)
Второй параметр, который мы передаем get_data
, это число байтов, которое мы ожидаем получить для каждой строки изображения.Поскольку мы хотим иметь все компоненты R, G и B для каждого пикселя, мы хотим, чтобы ширина изображения была в 3 раза больше.Если бы мы интересовались, скажем, интенсивностью каждого пикселя, мы бы передали параметры ('I', image.width)
. Вот некоторая официальная документация .
Чтобы получить значения только для самого интересующего вас пикселя, например, для (x,y)
, вы можете захотеть сделать вот что:
pos = (width*y + x) * 3
rgb = map(ord, data[pos:pos+3])
Вместо получения ImageData
для всего изображения и последующего выбора значений требуемого пикселя, вы также можете вызвать get_image_data()
для определенной области , то есть 1x1 пикселя в требуемомпозиция:
image_data = image.get_region(x,y,1,1).get_image_data()
Вот как это делается: это сообщение группы Google , где вы также можете найти полезную информацию, которая кажется более эффективной для получения данных изображениякак RGBA
вместо RGB
.
Установка отдельных пикселей
Теперь, чтобы окончательно ответить на вопрос, есть также метод установки для байтовых данных изображения ImageData, set_data
, который работает наоборот.
image_data.set_data('RGB', image.width*3, data)
Это, вероятно, работает и для регионов, но я не пробовал.Если вы хотите установить байтовые данные, которые вы сохранили в целочисленном массиве, передайте ''.join(map(chr, data))
.Я не знаю, есть ли способ установить числовые значения.
Надеюсь, это поможет кому-нибудь наткнуться на этот довольно старый вопрос, который пока что является выдающимся результатом Google для определенных поисковых терминов.