import numpy
import pickle
import pygame
surface = pygame.Surface((100, 100))
获取像素,转换为 RGBA。使用 Joe Kington 的提醒,数据范围从 -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]
和。实际上,正是出于这个原因才被引入 Python。[:, :, :, 3:2]
[..., 3:2]
...
,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
。当然, Axis-1
是最后一个轴,即numpy.newaxis
.