Преобразование байтов буфера поверхности Pygame в массив NumPy - PullRequest
0 голосов
/ 12 ноября 2018

Кто-нибудь знает, почему этот массив, который я создал из метода get_buffer в Pygame, имеет значения 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 голосов
/ 12 ноября 2018

Я понял, что есть гораздо лучший способ сделать это. Модуль pygame.surfarray имеет различные методы, которые фактически создают для вас пустые массивы!

>>> x3 = pygame.surfarray.pixels3d(screen)
>>> x3.shape
(256, 256, 3)
>>> x3[0, 0]
array([ 8, 16, 32], dtype=uint8)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...