将pygame表面缓冲区字节转换为numpy数组

时间:2018-11-11 22:45:36

标签: python pygame

有人知道为什么我从pygame的get_buffer方法创建的数组的R,G,B值颠倒了吗?我想创建一个颜色值与输入颜色顺序相同的数组-像[8, 16, 32, 0]。 pygame存储像素数据的方式有问题吗?

>>> import pygame
>>> import pygame.gfxdraw
>>> import numpy as np
>>> background_colour = (1, 1, 1)
>>> width, height = (256, 256)
>>> screen = pygame.Surface((width, height))
>>> pygame.draw.rect(screen, (8, 16, 32), (0, 0, 100, 100), 0)
<rect(0, 0, 100, 100)>
>>> s = screen.get_buffer()
>>> x = np.fromstring(s.raw, dtype='b').reshape(height, width, 4)
>>> x[0, 0]
array([32, 16,  8,  0], dtype=int8)

我尝试了这个,但是我放弃了R值:

>>> y = x[:, :, 3:0:-1]
>>> y[0, 0]
array([ 0,  8, 16], dtype=int8)

(我使用的是numpy版本1.8.2,所以我没有np.flip)。

1 个答案:

答案 0 :(得分:0)

我意识到有更好的方法来做到这一点。 pygame.surfarray模块有多种方法可以为您实际创建numpy数组!

>>> x3 = pygame.surfarray.pixels3d(screen)
>>> x3.shape
(256, 256, 3)
>>> x3[0, 0]
array([ 8, 16, 32], dtype=uint8)