如何在Pygame中以一些透明度对PNG进行blit?

时间:2009-10-27 23:09:30

标签: python png pygame alpha blit

我正试图将PNG图像blit到表面上,但由于某种原因,图像的透明部分变黑,这是简单的代码:

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

我该怎么做才能解决问题? 图像具有alpha透明度,我在PhotoShop中将其打开,背景变为透明,而不是黑色或白色或任何其他颜色。

感谢您的支持:)

4 个答案:

答案 0 :(得分:24)

http://www.pygame.org/docs/ref/image.html建议:

  

对于Alpha透明度,与.png图像一样,在加载后使用convert_alpha()方法,以使图像具有每像素透明度。

答案 1 :(得分:7)

你没有翻过双缓冲。

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

这应该适用于您的问题。

答案 2 :(得分:0)

您的代码看起来应该是正确的。 SDL库不支持像这样的alpha到alpha blitting,但是Pygame之前添加了对它的支持。在Pygame 1.8中添加了自定义混合模式的支持,我想知道是否删除了Pygame的内部alpha-to-alpha blitter?

唉,需要进一步调查。

答案 3 :(得分:0)

图像由"pygame.Surface"个对象表示。可以使用pygame.image.load从图像创建表面

my_image_surface = pygame.load.image('my_image.jpg')

但是,pygame文档指出:

返回的Surface将包含与它来自的文件相同的颜色格式,colorkey和alpha透明度。您通常会希望不带任何参数调用convert(),以创建一个副本,以便在屏幕上更快地绘制。
对于Alpha透明度,例如在.png图像中,请在加载后使用convert_alpha()方法,以使图像具有每个像素的透明度。

使用convert_alpha()方法可获得最佳性能:

alpha_image_surface = pygame.load.image('my_icon.png').convert_alpha()

可以使用blit方法在另一个表面上绘制表面或与之混合。 blit的第一个参数是应该绘制的 Surface 。第二个参数是表示左上角的元组( x y )或矩形。对于矩形,仅考虑矩形的左上角。应该提到的是,窗口分别显示的也用 Surface 表示。因此,在窗口中绘制 Surface 与在 Surface 上绘制 Surface 相同:

window_surface.blit(image_surface, (x, y))
window_surface.blit(image_surface,
    image_surface.get_rect(center = window_surface.get_rect().center))

最小示例: repl.it/@Rabbid76/PyGame-LoadTransparentImage

import pygame

pygame.init()
window = pygame.display.set_mode((300, 300))
clock = pygame.time.Clock()

pygameSurface = pygame.image.load('Porthole.png').convert_alpha()

background = pygame.Surface(window.get_size())
ts, w, h, c1, c2 = 50, *window.get_size(), (160, 160, 160), (192, 192, 192)
tiles = [((x*ts, y*ts, ts, ts), c1 if (x+y) % 2 == 0 else c2) for x in range((w+ts-1)//ts) for y in range((h+ts-1)//ts)]
for rect, color in tiles:
    pygame.draw.rect(background, color, rect)

run = True
while run:
    clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    window.blit(background, (0, 0))
    window.blit(pygameSurface, pygameSurface.get_rect(center = window.get_rect().center))
    pygame.display.flip()

pygame.quit()
exit()