2009-10-27 34 views
11

Je suis en train de blit une image PNG sur une surface, mais la partie transparente de l'image devient noir pour une raison quelconque, voici le code simple:Comment est-ce que je blit un PNG avec une certaine transparence sur une surface dans Pygame?

screen = pygame.display.set_mode((800, 600), pygame.DOUBLEBUF, 32) 

world = pygame.Surface((800, 600), pygame.SRCALPHA, 32) 
treeImage = pygame.image.load("tree.png") 

world.blit(treeImage, (0,0), (0,0,64,64)) 
screen.blit(world, pygame.rect.Rect(0,0, 800, 600)) 

Que dois-je faire pour résoudre le problème ? L'image a une transparence alpha, je l'ai ouverte dans PhotoShop et l'arrière-plan devient transparent, pas noir ou blanc ou toute autre couleur.

Nous vous remercions pour votre soutien :)

Répondre

21

http://www.pygame.org/docs/ref/image.html recommande:

Pour transparence alpha, comme dans les images .png utiliser la méthode convert_alpha() après le chargement afin que l'image a par la transparence des pixels.

+1

pygame.image.load aura déjà alpha lorsqu'il est chargé à partir d'une image avec alpha. –

+2

@PeterShinners, appelant 'convert()' ou 'convert_alpha()' est toujours préférable car ne pas le faire signifiera que les blits nécessiteront tous une conversion en format pixel, ce qui est extrêmement lent. – congusbongus

0

Votre code semble devoir être correct. La bibliothèque SDL ne prend pas en charge l'alpha-alpha comme ça, mais Pygame a ajouté un support il y a un certain temps. Dans Pygame 1.8, le support a été ajouté pour les modes de fusion personnalisés, et je me demande si cela a supprimé le blitter alpha-alpha interne de Pygame?

Hélas, d'autres recherches seront nécessaires.

7

Vous n'avez pas retourné le double tampon.

import pygame 
from pygame.locals import Color 

screen = pygame.display.set_mode((800, 600)) 

treeImage = pygame.image.load("tree.png").convert_alpha() 

white = Color('white') 

while(True): 
    screen.fill(white) 
    screen.blit(treeImage, pygame.rect.Rect(0,0, 128, 128)) 
    pygame.display.flip() 

Cela devrait fonctionner pour votre problème.