[Python/pyglet] Changer une couleur dans un fichier PNG en transparence

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Dans le but de créer un petit jeu en python avec Pyglet je désires utiliser des tilesheet (des page de tuiles/sprites pour les anglophobes)

J’ai réussi a séparer mon image en plusieurs tuiles a l’aide des lignes de code suivantes:

tileSheet = pyglet.resource.image("tilesheet.png")
tileSheetList = pyglet.image.ImageGrid(tileSheet, 4, 10)

Cela marche parfaitement mais, dans mon image d’origine j’ai des sprites nécessitants une transparence.

Ne voulant pas m’embêter a chaque fois que j’ajoute un nouveau sprites a devoir utiliser des logiciels pour changer la couleur de fond en transparence, j’utilise la couleur rose RGB: (255,0,255)

Ayant fait des tests avec Pygame, j’eus reussi à le faire grace aux lignes qui suivent:

tileSheet = pygame.image.load("tilesheet.png").convert()
alphaColor = (255, 0, 255)
tileSheet.set_colorkey(alphaColor)

Mais Pygame étant très limité a cause de SDL2 je suis vite passé a Pyglet et donc OpenGL sauf que je ne retrouves pas de fonction similaire pour faire cela

Auriez vous une solution pour changer une couleur en transparence alpha sans altéré les autres couleurs de l’image?

+0 -0

Salut,

Ne te serait-il pas plus simple de modifier ton fichier PNG pour remplacer ces pixels roses par des pixels transparents, et ne plus faire de post-traitement une fois dans le programme ?

Parce qu’en dehors de ça les primitives fournies par pyglet pour gérer les images sont très basiques, donc je ne suis pas sûr que tu puisses trouver ça. Il te faudrait alors le faire manuellement, probablement avec pillow.

Merci pour les réponses rapide

Le truc c’est qu’étant vraiment au tout début du développement du jeu, je rajoute beaucoup de sprites, donc devoir refaire les transparences a chaque fois c’est assez long.

Je penses que je vais me faire un script avec pillow, merci du conseil.

Sinon j’avais une autre question, toujours concernant Pyglet et les images.

Dans Pygame on peut "blit" sur des surface créer au préalable pour faire une sorte de buffer.

Mon jeu étant basé sur des tuiles c’est très long de devoir afficher a nouveau toutes les tuiles a chaque frame. Dans Pygame j’avais trouvé la solution de "blit" une première fois mes tuiles sur une surface au moment de l’initialisation, puis d’afficher cette surface à l’écran. Et si jamais une tuile venait a changer dans le programme j’avais fais une fonction qui remplacer uniquement cette tuile.

Il y a t’il le même principe sur pyglet? Une sorte de surface ou de calque temporaire sur lequel je pourrais faire un pré-rendu avant de l’afficher?

Merci par avance

EDIT: voici le code que j’utilise désormais pour changer mon rose en transparence (sait on jamais si quelqu’un passe par là et en a besoin)

from PIL import Image

img = Image.open('tilesheet.png')
img = img.convert("RGBA")
datas = img.getdata()

newData = []
for item in datas:
    if item[0] == 255 and item[1] == 0 and item[2] == 255:
        newData.append((255, 255, 255, 0))
    else:
        newData.append(item)

img.putdata(newData)
img.save("tilesheet2.png", "PNG")
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte