python - sprites - pygame tutorial español pdf
¿Cómo invertir los colores de una imagen en pygame? (3)
La respuesta de Winston es agradable, pero, para completar, cuando uno tiene que manipular una imagen píxel por píxel en Python, se debe evitar el bucle en cada píxel, sin importar qué biblioteca de imágenes esté en uso. Esto requiere mucho uso de la CPU debido a la naturaleza del idioma, y rara vez se puede hacer que funcione en tiempo real.
Afortunadamente, la excelente biblioteca NumPy puede ayudar a realizar varias operaciones escalares en flujos de bytes, haciendo un bucle sobre cada número en código nativo, lo cual es mucho más rápido que hacerlo solo en Python. Para esta operación en particular, si usamos una operación xor
con (2^32 - 1)
, podemos delegar la operación al bucle interno en el código nativo.
Este ejemplo, que puede pegar directamente en su consola de Python, convertirá instantáneamente los píxeles en blancos (si tiene instalado NumPy):
import pygame
srf = pygame.display.set_mode((640,480))
pixels = pygame.surfarray.pixels2d(srf)
pixels ^= 2 ** 32 - 1
del pixels
pygame.display.flip()
Sin NumPy instalado, los métodos de pygame.surfarray
devuelven matrices ordinarias de Python (desde el módulo de matriz stdlib
) y tendrías que encontrar otra forma de operar con estos números, ya que la matriz de Python ordinaria no opera en todos los elementos cuando una línea como pixels ^= 2 ** 32 - 1
es dado.
Tengo una superficie de pygame y me gustaría invertir los colores. ¿Hay alguna manera más rápida y más pitonica que esto? Es bastante lento
Soy consciente de que restar el valor de 255 no es la única definición de "color invertido", pero es lo que quiero por ahora.
¡Estoy sorprendido de que pygame no tenga algo como esto incorporado!
¡Gracias por tu ayuda!
import pygame
def invertImg(img):
"""Inverts the colors of a pygame Screen"""
img.lock()
for x in range(img.get_width()):
for y in range(img.get_height()):
RGBA = img.get_at((x,y))
for i in range(3):
# Invert RGB, but not Alpha
RGBA[i] = 255 - RGBA[i]
img.set_at((x,y),RGBA)
img.unlock()
Tomado de: http://archives.seul.org/pygame/users/Sep-2008/msg00142.html
def inverted(img):
inv = pygame.Surface(img.get_rect().size, pygame.SRCALPHA)
inv.fill((255,255,255,255))
inv.blit(img, (0,0), None, BLEND_RGB_SUB)
return inv
Esto puede hacer que el canal alfa sea incorrecto, pero debería poder hacerlo funcionar con ajustes adicionales.
Un enfoque que podría ser más eficiente sería usar PIL , como se describe aquí: ¿Cómo invertir los colores de la imagen con PIL (Python-Imaging)?
Es fácil convertirlo a una imagen de pygame nativa en la memoria, como se describe aquí: http://mail.python.org/pipermail/image-sig/2005-May/003315.html