2009-10-27 71 views
11

Tôi đang cố gắng để blit một hình ảnh PNG lên một bề mặt, nhưng phần trong suốt của hình ảnh chuyển sang màu đen đối với một số lý do, đây là mã đơn giản:Làm cách nào để trích xuất PNG có độ trong suốt lên bề mặt trong 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)) 

gì làm tôi phải làm gì để giải quyết vấn đề ? Hình ảnh có độ trong suốt alpha, tôi đã mở nó trong PhotoShop và nền chuyển sang màu trong suốt, không phải màu đen hoặc trắng hoặc bất kỳ màu nào khác.

Cảm ơn bạn đã hỗ trợ của bạn :)

Trả lời

21

http://www.pygame.org/docs/ref/image.html khuyến cáo:

Đối với tính minh bạch alpha, như trong hình ảnh .png sử dụng phương pháp convert_alpha() sau khi tải để hình ảnh có mỗi tính minh bạch pixel.

+1

pygame.image.load sẽ có alpha khi được tải từ hình ảnh có alpha. –

+2

@PeterShinners thực sự, gọi 'convert()' hoặc 'convert_alpha()' vẫn được ưu tiên vì không làm như vậy nghĩa là tất cả các blits đều sẽ yêu cầu chuyển đổi định dạng pixel, cực kỳ chậm. – congusbongus

0

Mã của bạn có vẻ như chính xác. Thư viện SDL không hỗ trợ alpha để alpha blitting như thế này, nhưng Pygame thêm hỗ trợ cho nó một thời gian trước đây. Trong hỗ trợ Pygame 1.8 đã được thêm vào cho các chế độ hoà trộn tùy chỉnh, và tôi tự hỏi liệu nó có xóa bỏ bộ phát alpha-to-alpha bên trong của Pygame không?

Than ôi, cần điều tra thêm.

7

Bạn không lật bộ đệm kép.

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

Điều này sẽ hữu ích cho sự cố của bạn.

Các vấn đề liên quan