Objeto de pygame para obtener acceso directo a los pixels de las superficies.
pygame.PixelArray(Surface): return PixelArray
La clase PixelArray
envuelve una superficie y provee acceso
directo a sus pixels, usando una matriz de dos dimensiones. Soporta
operaciones como slicing
(tajadas o rebanadas), manipulación
de pixel o fila y asignaciones aunque no se permiten las operaciones
de suma, resta, multiplicación o división…
Si bien es posible asignar tanto colores en valor entero como
tuplas RGB(A), la clase PixelArray
utilizará internamente enteros para
la representación de elementos. Por ello, la consulta de ciertos
colores se debe realizar usando el método Surface.map_rgb()
de la superficie.
pxarray = pygame.PixelArray (surface) # Check, if the first pixel at the topleft corner is blue if pxarray[0][0] == surface.map_rgb ((0, 0, 255)): ...
Los pixels se pueden manipular usando valores enteros o tuplas con las componentes de color.
pxarray[x][y] = 0xFF00FF pxarray[x][y] = (255, 0, 255)
Si está trabajando sobre una rebanada (o slice) puede usar
secuencias arbitrarias u otros objetos PixelArray
para modificar
los pixels. De todas formas tienen que coincidir con el tamaño
del objeto.
pxarray[a:b] = 0xFF00FF # define todos los pixels a 0xFF00FF. pxarray[a:b] = (0xFF00FF, 0xAACCEE, ... ) # El primer pixel a 0xFF00FF, # el segundo a 0xAACCEE. pxarray[a:b] = ( (255, 0, 255), (170, 204, 238), ...) # igual que arriba. pxarray[a:b] = ( (255, 0, 255), 0xAACCEE, ...) # igual que arriba. pxarray[a:b] = otherarray[x:y] # note que el tamaño de las rebanadas debe coincidir.
Tenga en cuenta que algo como:
pxarray[2:4][3:5] = ...
No causará una manipulación rectangular. En lugar de ello primero
se reducirá a una matriz de dos columnas, que luego se reducirá
en columnas una vez mas, lo que ocasionará una falla de tipo
IndexError
. Esto se debe al mecanismo de rebanadas (slicing)
de python y es un comportamiento absolutamente correcto. En cambio,
lo que puede hacer es crear una rebanada de una sola columna
primero y luego manipularla de la siguiente forma
pxarray[2][3:5] = ... pxarray[3][3:5] = ...
También puede usar las habilidades de sub-indices, para
realizar una manipulación rectangular o crear una
vista de una parte del objeto PixelArray
. Puede crear
una vista diferente de manera simple creando “sub-arrays” mediante
los sub-indices.
# Genera un nuevo objeto PixelArray otorgando una vista diferente # de la superficie o matriz original. newarray = pxarray[2:4,3:5] otherarray = pxarray[::2,::2]
Los sub-indices también se puede usar para realizar manipulaciones
de pixel rectangulares en lugar de recorrer los ejes x
e y
como
se hacía mas arriba.
pxarray[::2,:] = (0, 0, 0) # Convierte a negro cada segunda columna.
El objeto PixelArray
bloquea la superficie mientras existe, por eso
tiene que eliminarlo de manera explícita cuando ya no lo use y la
superficie debería realizar las operaciones en el mismo momento.
Esta funcionalidad es nueva en pygame 1.8, y los sub-indices son nuevos en pygame 1.8.1
Obtiene la superficie que utiliza el objeto PixelArray
.
PixelArray.surface: Return Surface
Retorna la superficie para la que se creó el objeto PixelArray
.
Genera una nueva superficie a partir del objeto PixelArray
actual.
PixelArray.make_surface (): Return Surface
Genera una nueva superficie a partir del objeto PixelArray
. Esta
superficie puede ser diferente de la original dependiendo del
tamaño del objeto, el orden de pixel etc.
# Genera una nueva superficie invertida sobre el eje vertical. sf = pxarray[:,::-1].make_surface ()
Esta función es nueva en pygame 1.8.1
Replaces the passed color in the PixelArray with another one.
PixelArray.replace (color, repcolor, distance=0, weights=(0.299, 0.587, 0.114)): Return None
Reemplaza los pixels que tienen el color repcolor
por el color
color
.
Usa una formula de distancia euclidea simple para calcular la distancia entre los colores. Los espacios de distancia van desde 0.0 a 1.0 y se usan como umbral para detectar el color. Esto causa que la operación de reemplazo tome pixels con un color similar, pero no exactamente el mismo.
Esta es una operación in place, lo que significa que afecta directamente
a los pixels del objeto PixelArray
.
Esta función es nueva en pygame 1.8.1
Extrae el color indicado del objeto PixelArray
.
PixelArray.extract (color, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray
Extrae el color indicado cambiando todos los pixels que coinciden
a blanco, mientras que los pixels que no coinciden se cambian
a color negro. Esta función retorna un nuevo objeto PixelArray
con la máscara de color blanco y negro.
Usa una formula de distancia euclidea simple para calcular la distancia entre los colores. Los espacios de distancia van desde 0.0 a 1.0 y se usan como umbral para detectar el color. Esto causa que la operación de reemplazo tome pixels con un color similar, pero no exactamente el mismo.
Esta función es nueva en pygame 1.8.1
Compara el objeto PixelArray con otro.
PixelArray.compare (array, distance=0, weights=(0.299, 0.587, 0.114)): Return PixelArray
Compara el contenido del objeto PixelArray
con otro objecto
PixelArray
. Retorna un nuevo objeto PixelArray
con la máscara
de color blanco y negro que indica las diferencias (en blanco) y similitudes
(en negro). Los dos objetos PixelArray
deben tener dimensiones y
cantidad de colores idénticas.
Usa una formula de distancia euclidea simple para calcular la distancia entre los colores. Los espacios de distancia van desde 0.0 a 1.0 y se usan como umbral para detectar el color. Esto causa que la operación de reemplazo tome pixels con un color similar, pero no exactamente el mismo.
Esta función es nueva en pygame 1.8.1.