2009-10-27 34 views
11

estoy tratando de blit una imagen PNG sobre una superficie, pero la parte transparente de la imagen se vuelve negro por alguna razón, aquí está el código simple:¿Cómo bligo un PNG con cierta transparencia en una superficie en 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)) 

¿Qué tengo que hacer para resolver el problema ? La imagen tiene transparencia alfa, la he abierto en PhotoShop y el fondo se vuelve transparente, no negro o blanco o de cualquier otro color.

Gracias por su apoyo :)

Respuesta

21

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

Por transparencia alfa, como en las imágenes .png utilizar el método convert_alpha() después de la carga de manera que la imagen tiene por la transparencia de píxel.

+1

pygame.image.load ya tendrá alfa cuando se carga desde una imagen con alfa. –

+2

@ PeterShinners en realidad, llamar a 'convert()' o 'convert_alpha()' aún se prefiere, ya que no hacerlo significará que los blits requerirán conversión de formato de píxel, que es extremadamente lenta. – congusbongus

0

Parece que su código es correcto. La biblioteca SDL no es compatible con alfabético alfa a alfabético como este, pero Pygame agregó soporte hace un tiempo. En Pygame 1.8, se agregó soporte para modos de fusión personalizados, y me pregunto si eso eliminó el blitter alfa-a-alfa interno de Pygame.

Por desgracia, se requerirán más investigaciones.

7

No ha activado el doble buffer.

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

Esto debería funcionar para su problema.

Cuestiones relacionadas