Python Pygame透明度显示为黑色

3

我试图在地图的剩余部分上方放置一张带有透明度的图像(这是第二层)。当我执行blit操作时,它会以黑色显示透明度。请问有没有办法解决这个问题?下面是相关代码。

lily_tex = spritesheet.get_sprite(1, 4).convert_alpha()

获取精灵表中的图像。

    img = pygame.Surface((self.tilesize, self.tilesize))
    img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))
    return img.convert()

这是从精灵表中提取它的方式。 以下是将其blit到表面以供blit到屏幕缓冲区的方法。

def create_map(self):
    for map_data in self.map_data:
        for row in range(len(map_data)):
            for column in range(len(map_data[row])):
                if map_data[row][column] == 0:
                    continue
                texture = self.key.get(map_data[row][column])
                self.map_img.blit(texture, (column * self.tilesize, row * self.tilesize))

感谢您。

1
我不能确定,但我建议将 return img.convert() 替换为 return img.convert_alpha()。但是,如果您已经对 self.img 进行了 convert(),则不需要转换 blit 产生的图像/表面。再次进行 convert() 可能会删除在原始 convert_alpha() 中保留的 alpha 值。 - Glenn Mackintosh
你可以尝试一下:img = pygame.Surface((self.tilesize, self.tilesize), pygame.SRCALPHA)。 这将创建一个带有α通道的Surface。 - Kingsley
谢谢,看了这个之后,我添加了 convert_alpha() 并在其他地方看到需要添加 img.setcolorkey((0, 0, 0)),因为那是图像背景的颜色。我认为它需要这样做是因为图像可能使用黑色来显示透明度。在文件浏览器中查看图像时,有时会变成黑色。带有 alpha 通道的 surface 可能有效,但我认为这是图像问题,而不是 pygame 的问题。 - Some Goose
1个回答

0
当您调用convert()时,图像的像素格式会发生更改。如果图像格式具有每个 alpha 像素,则此信息将丢失。
请使用convert_alpha()代替convert()

return img.convert()

return img.convert_alpha()

如果图像没有每个像素的alpha格式,您必须使用set_colorkey()函数设置透明色键。
img = pygame.Surface((self.tilesize, self.tilesize))
img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))
img.set_colorkey((0, 0, 0))

或者,您可以使用SRCALPHA标志创建一个具有每像素透明度格式的表面:

img = pygame.Surface((self.tilesize, self.tilesize), pygame.SRCALPHA)
img.blit(self.img, (0, 0), (x, y, self.tilesize, self.tilesize))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接