J'ai une surface pygame et je voudrais inverser les couleurs. Y a-t-il un moyen plus rapide et plus pythonique que cela? C'est plutôt lent.
Je suis conscient que la soustraction de la valeur de 255 n'est pas la seule définition d'une "couleur inversée", mais c'est ce que je veux pour le moment. P>
Je suis surpris que Pygame n'a pas quelque chose comme celui-ci intégré! p>
Merci pour votre aide! P>
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()
3 Réponses :
Une approche qui pourrait être plus efficace serait d'utiliser PIL , comme décrit ici : Comment inverser les couleurs d'image avec PIL (python Imagerie)? P>
Il est facile de le convertir en une image pygame native en mémoire, comme décrit ici: http://mail.python.org/pipermarmail/image-sig/2005-may/003315.html P>
Merci, mais j'essaie d'éviter des modules supplémentaires et je me suis déjà engagé à pygame. J'aurais dû mentionner que plus tôt, désolé!
@Agne-Bretagne, n'est pas. Une énorme force de Python est la quantité massive de code déjà écrit pour vous. Vous manquez si vous n'ajoutez pas de module qui aident à soutenir ce que vous voulez.
@Winston: Toutefois, comme les réponses de vos miennes indiquées, PIL n'est pas la meilleure chose pour cela - la conversion entre les données d'image entre les surfaces PIL et Pygame est douloureuse en soi.
@jsbueno, oui, dans ce cas avec PIL est surchargé. Mais en principe, il ne faut pas avoir peur d'utiliser des bibliothèques supplémentaires.
@Winston Ewert d'accord 100% sur la réutilisation du code. Malheureusement, Pil est une sorte de dépendance de merde à avoir. Je suis sûr que vous saviez cela, mais je pensais juste que je le mentionnerais pour nos lecteurs :-)
@Brian, je ne suis pas au courant d'aucun problème particulier de PIL, même si je ne l'ai pas beaucoup utilisé.
@Winston Ewert: C'est surtout les mêmes problèmes que vous rencontrez avec toutes les extensions Python implémentées dans C, obtenir les dépendances de construction et d'exécution. C'est surtout une douleur lorsque vous utilisez virtualenv / bâtiment.
tiré de: http://archives.seul.org/pygameme /USERSERS/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
La réponse de Winston est belle, mais pour des raisons d'exhaustivité, lorsque l'on doit manipuler une image pixel-by-pixel à Python, il faut éviter de boucler à travers chaque pixel, quelle que soit la bibliothèque d'images utilisée. Ceci est intensif de la CPU en raison de la nature de la langue et peut rarement être faite pour travailler en temps réel.
Heureusement, l'excellent Bibliothèque NUMPY FORT> peut aider à effectuer plusieurs opérations scalaires dans des ruisseaux d'octets, Looping sur chaque numéro dans le code natif, qui est des ordres de grandeur plus rapidement que de le faire uniquement en python. Pour cette opération particulière, si nous utilisons une opération Cet exemple, que vous pouvez coller directement dans votre console Python, retournerez les pixels instantanément au blanc (si vous avez INSTALLÉ INSTALLÉ): P> XOR code> avec
(2 ^ 32 - 1) code>, nous pouvons déléguer l'opération à la boucle interne dans le code natif. P >
import pygame
srf = pygame.display.set_mode((640,480))
pixels = pygame.surfarray.pixels2d(srf)
pixels ^= 2 ** 32 - 1
del pixels
pygame.display.flip()
Numpy est génial, je l'utilise dans presque tous les projets Python
@jsbueno je suis curieux, pourquoi avez-vous fait "del pixels"?
@jsbueno Eh bien, j'ai compris que vous devez supprimer la surfarray pour déverrouiller la surface. Mais ce que je ne peux pas comprendre malgré 3 heures de recherche, c'est comment la valeur que vous recevez de la valeur = pixels [x, y] correspond aux valeurs RVB. Ce n'est pas hex, qu'est-ce que c'est? pygame.surfarray.pixels3d (SRF) vous donne [x] [y] [r, g, b], mais qu'en est-il de la matrice 2D?
@Ain, hexagone est juste un moyen de représenter un nombre. Si vous passez la valeur dans la fonction HEX (), vous obtiendrez la représentation hexagonale.
@Winston Ewert Je n'ai pas compris ce que vous vouliez dire au début, mais j'ai découvert que je convertis la valeur RBG, EX 3112142 en hexagonal avec hexagonal (3112142), je reçois 0xRRGGBB, où, par exemple, RR est la base-16 rouge valeur. Phew! Vous devez donc l'analyser et faire INT ("RR", 16) pour obtenir les valeurs 0-255.