Ответ Уинстона хорош, но для полноты картины, когда нужно манипулировать изображением попиксельно в Python, нужно избегать циклического прохождения каждого пикселя, независимо от того, какая библиотека изображений используется. Это сильно загружает процессор из-за особенностей языка, и его редко можно заставить работать в реальном времени.
К счастью, отличная библиотека NumPy может помочь выполнить несколько скалярных операций в потоках байтов, циклически обрабатывая каждое число в собственном коде, что на несколько порядков быстрее, чем в Python. Для этой конкретной операции, если мы используем операцию xor
с (2^32 - 1)
, мы можем делегировать операцию внутреннему циклу в собственном коде.
Этот пример, который вы можете вставить непосредственно в консоль Python, мгновенно перевернет пиксели на белый (если у вас установлен NumPy):
import pygame
srf = pygame.display.set_mode((640,480))
pixels = pygame.surfarray.pixels2d(srf)
pixels ^= 2 ** 32 - 1
del pixels
pygame.display.flip()
Без установленного NumPy методы pygame.surfarray
возвращают обычные массивы Python (из модуля массива stdlib
), и вам придется искать другой способ работы с этими числами, поскольку обычный массив Python не работает со всеми элементами, когда дается строка, такая как pixels ^= 2 ** 32 - 1
.