2009-10-27 8 views
11

Próbuję Blit obrazu PNG na powierzchnię, ale przezroczysta część obrazu staje się czarny z jakiegoś powodu, oto prosty kod:Jak zbryzgować PNG z jakąś przezroczystością na powierzchni w 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)) 

Co muszę zrobić, aby rozwiązać ten problem ? Obraz ma przezroczystość alfa, otworzyłem go w PhotoShop, a tło zmieni się na przezroczyste, a nie czarne lub białe lub inny kolor.

Dziękuję za wsparcie :)

Odpowiedz

21

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

Dla przejrzystości alfa, jak w .png obrazów użyć metody convert_alpha() po załadunku tak, że obraz ma za przezroczystości pikseli.

+1

pygame.image.load będzie już mieć alfa po załadowaniu z obrazka z alfą. –

+2

@PeterShinners w rzeczywistości, wywołanie 'convert()' lub 'convert_alpha()' jest nadal preferowane, ponieważ niezastosowanie się do tego spowoduje, że wszystkie blity będą wymagać konwersji w formacie pikseli, co jest bardzo powolne. – congusbongus

0

Twój kod wygląda na poprawny. Biblioteka SDL nie obsługuje alfa do blendowania alfa w ten sposób, ale Pygame dodała do niego wsparcie już jakiś czas temu. W wersji Pygame 1.8 dodano obsługę niestandardowych trybów mieszania i zastanawiam się, czy to usunęło wewnętrzną alfa-a-alpha urządzenia Pygame?

Niestety, dalsze śledztwo będzie wymagane.

7

Nie przerzuciłeś podwójnego bufora.

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

To powinno działać dla Twojego problemu.

Powiązane problemy