首页 > 解决方案 > 我的图片中的 alpha 通道有问题(PyGame)

问题描述

目前,我正在尝试将一张图片粘贴到我的 pygame 游戏中,并且这张图片有一个 alpha 通道(正如你在这句话下面看到的那样)。

原图

但是,由于某种原因,当我使用convert()or时convert_alpha(),它没有正确地将带有 alpha 通道的图片放在游戏中......即使我尝试对图片进行一些主要操作,也没有。

发生了什么(操作)

这是我尝试编写的代码(对 alpha 通道的操作不起作用):

class Spritesheet:
    # utility class for loading and parsing spritesheets
    def __init__(self, filename):
        self.spritesheet = pygame.image.load(filename).convert()

    def get_image(self, x, y, width, height):
        # grab an image out of a larger spritesheet
        image = pygame.Surface((width, height))
        image.fill(pygame.color.Color("black"))
        image.blit(self.spritesheet, (0, 0), (x, y, width, height))
        image.set_colorkey(pygame.color.Color("black"))
        return image

我怎样才能把原来有alpha通道的图片放在上面?

标签: pythonpygame

解决方案


确保图像具有透明度信息。如果背景不透明,则无法神奇地得到它(除了背景具有统一的颜色)。见Pygame 图像透明度混淆


您必须使用convert_alpha而不是convert

self.spritesheet = pygame.image.load(filename).convert()

self.spritesheet = pygame.image.load(filename).convert_alpha()

用于convert_alpha()创建具有按像素提供 alpha 的图像格式的Surface副本。使用 时convert,会丢失图像的 alpha 通道和透明度。

另外创建一个具有每像素 alpha 格式的Surface 。设置SRCALPHA标志以创建具有包含每像素 alpha 的图像格式的表面:

image = pygame.Surface((width, height))

image = pygame.Surface((width, height), pygame.SRCALPHA)
class Spritesheet:
    # utility class for loading and parsing spritesheets
    def __init__(self, filename):
        self.spritesheet = pygame.image.load(filename).convert_alpha()

    def get_image(self, x, y, width, height):
        # grab an image out of a larger spritesheet
        image = pygame.Surface((width, height), pygame.SRCALPHA)
        image.fill(pygame.color.Color("black"))
        image.blit(self.spritesheet, (0, 0), (x, y, width, height))
        return image

或者,您可以使用pygame.Surface.subsurface. 请参阅如何使用 Pygame 裁剪图像?.

class Spritesheet:
    # utility class for loading and parsing spritesheets
    def __init__(self, filename):
        self.spritesheet = pygame.image.load(filename).convert_alpha()

    def get_image(self, x, y, width, height):
        return image.subsurface(pygame.Rect(x, y, width, height))

推荐阅读