Ответ 1
import numpy
import pickle
import pygame
surface = pygame.Surface((100, 100))
Получить пиксели, конвертировать в RGBA. Использование Джо Кингтона напоминает, что данные варьируются от -1 до 1:
base = (pickle.load(open("g.pickle"))+1)/2 * 255
base = base[..., numpy.newaxis].repeat(4, -1).astype("uint8")
Скопируйте данные через
numpy_surface = numpy.frombuffer(surface.get_buffer())
numpy_surface[...] = numpy.frombuffer(base)
del numpy_surface
Показывать с помощью:
screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()
и вы получите
И упрощен, еще раз благодаря вводу Джо Кингтона, используя make_surface
:
import numpy
import pickle
import pygame
base = (pickle.load(open("g.pickle"))+1) * 128
base = base[..., None].repeat(3, -1).astype("uint8")
surface = pygame.surfarray.make_surface(base)
screen = pygame.display.set_mode((100, 100))
screen.blit(surface, (0, 0))
pygame.display.flip()
base[..., None]
обычно пишется base[..., numpy.newaxis]
, но, видя, что это единственный экземпляр numpy
, я просто "расширил константу", чтобы не нуждался в numpy
. Однако это не сработало, так как код ломается, если вы не импортируете numpy
с помощью IndexError: bytes to write exceed buffer size
. Спасибо, numpy
.
...
означает "всю всю ось до этой точки", поэтому вы можете заменить [3:2]
, [:, 3:2]
и [:, :, :, 3:2]
на [..., 3:2]
. Фактически, ...
был введен в Python именно по этой причине.
None
, или numpy.newaxis
, срезает новую ось (duh). Это, например, преобразует [a, b, c]
в [[a], [b], [c]]
. Это необходимо, потому что мы тогда repeat
вдоль этой новой оси.
В принципе, глядя на одну строку, мы имеем
114, 202, 143, ...
и мы хотим
[114, 114, 114], [202, 202, 202], [143, 143, 143], ...
поэтому наш [..., None]
довел нас до
[114], [202], [143], ...
и мы просто repeat
3
раз на оси -1
. Ось -1
- это, конечно, последняя ось, которая является numpy.newaxis
.