tutorial sprites probar imagenes español colision python graphics colors pygame invert

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.