2009-10-27 10 views
11

Sto cercando di blit un'immagine PNG su una superficie, ma la parte trasparente dell'immagine diventa nero per qualche ragione, ecco il codice semplice:Come si configura un PNG con una trasparenza su una superficie in 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)) 

Che cosa devo fare per risolvere il problema ? L'immagine ha trasparenza alfa, l'ho aperta in PhotoShop e lo sfondo diventa trasparente, non nero o bianco o di qualsiasi altro colore.

Grazie per il vostro sostegno :)

risposta

21

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

Per trasparenza alfa, come nelle immagini .png utilizzare il metodo convert_alpha() dopo il caricamento in modo che l'immagine ha per la trasparenza dei pixel.

+1

pygame.image.load avrà già alfa quando caricato da un'immagine con alfa. –

+2

@PeterShinners in realtà, chiamare 'convert()' o 'convert_alpha()' è ancora preferito poiché non farlo significherebbe che tutti i blit richiedono la conversione del formato pixel, che è estremamente lento. – congusbongus

0

Il codice sembra corretto. La libreria SDL non supporta alpha to alpha blitting come questo, ma Pygame ha aggiunto il supporto per un po 'di tempo fa. In Pygame 1.8 è stato aggiunto il supporto per i metodi di fusione personalizzati e mi chiedo se questo abbia rimosso il blitter alfa-alpha di Pygame interno?

Ahimè, ulteriori indagini saranno richieste.

7

Non è stato attivato il doublebuffer.

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() 

Questo dovrebbe funzionare per il tuo problema.

Problemi correlati