假设为简单起见,您只有值 [0,1],否则最好将值截断到固定范围,以便通过一些浮点值,例如 0,5,您始终具有相同的颜色输出。
我将以简单的水平渐变作为输入示例:
W = 300
H = 200
# generate simple gradient in float
F0 = numpy.linspace(0, 1, num = W)
F = numpy.tile(F0, (H, 1))
现在有几种方法可以显示它。在这种情况下,我很可能会在 8 位表面上显示它。在这种情况下,您将需要它来以 Pygame 格式定义调色板:
def make_palette (C1, C2):
palR = numpy.linspace(C1[0], C2[0], num = 256, dtype = "uint8")
palG = numpy.linspace(C1[1], C2[1], num = 256, dtype = "uint8")
palB = numpy.linspace(C1[2], C2[2], num = 256, dtype = "uint8")
return zip(palR,palG,palB)
这将数据从数组复制到表面:
def put_arr(Dest, Src):
buf = Dest.get_buffer()
buf.write(Src.tostring(), 0)
现在在程序的开头,您初始化与数组大小相同的表面并应用调色板:
I_surf = pygame.Surface((W, H), 0, 8) # Pygame surface
C1 = (0,0,250)
C2 = (250,0,0)
palRGB = make_palette (C1, C2)
I_surf.set_palette(palRGB)
在主循环中你有类似的东西:
I = numpy.rint( F*255 ).astype("uint8")
put_arr(I_surf, I)
...
DISPLAY.blit(I_surf, (100, 100))
注意数组和表面的类型,在这种情况下它们都必须是 8 位。
如果一切正常,您必须在窗口中看到:
