Python 使用Surface.copy()有时会失去透明度

Python 使用Surface.copy()有时会失去透明度,python,pygame,Python,Pygame,对于某些(但不是所有!)图像,使用surface.copy()复制曲面会丢失透明度。我有两个问题 为什么复制会失去透明度?新曲面的所有声音都应该是一样的,但这显然没有发生 为什么有些图像会出现这种情况,而其他图像则不会 下面是一个“坏”图像的例子——复制时,透明度会丢失 下面是一个“良好”图像的示例——复制时,透明度不会丢失 下面是您可以运行的代码,以查看差异: import pygame def test(): screen = pygame.display.set_mode((

对于某些(但不是所有!)图像,使用
surface.copy()
复制曲面会丢失透明度。我有两个问题

  • 为什么复制会失去透明度?新曲面的所有声音都应该是一样的,但这显然没有发生

  • 为什么有些图像会出现这种情况,而其他图像则不会

  • 下面是一个“坏”图像的例子——复制时,透明度会丢失

    下面是一个“良好”图像的示例——复制时,透明度不会丢失

    下面是您可以运行的代码,以查看差异:

    import pygame
    
    def test():
        screen = pygame.display.set_mode((320, 240))
        bad_original = pygame.image.load('bad-image.gif') 
        bad_copied = bad_original.copy()
    
        good_original = pygame.image.load('good-image.gif') 
        good_copied = good_original.copy()
    
        while True:
            for event in pygame.event.get():
                if (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE or
                    event.type == pygame.QUIT):
                    pygame.quit()
    
            screen.fill((150, 150, 150))
    
            screen.blit(bad_original, (0,0))
            screen.blit(bad_copied, (100, 0))
            screen.blit(good_original, (0,100))
            screen.blit(good_copied, (100, 100))
            pygame.display.flip()
    
    if __name__ == '__main__':
        test()
    
    最后,这里是运行上述代码的截图。

    请注意,我不是在寻找变通办法;我只想知道我对
    surface.copy
    有什么不了解,或者你认为我对使用Pygame surface可能不了解的任何内容


    我正在Windows 7机器上使用Python 3.3和Pygame 1.9.2Pro。

    您需要使用.convert_alpha()

    尝试:

    见:

    “使用所需的像素格式创建曲面的新副本。新曲面的格式将适合以每像素alpha快速光点显示到给定格式。如果未提供曲面,则新曲面将优化为光点显示到当前显示。”

    与Surface.convert()方法不同,新图像的像素格式将与请求的源不完全相同,但它将进行优化,以便快速alpha blitting到目标。”


    在pygame中,无论何时加载和图像,或创建曲面以显示它,如果它没有透明度,则应.convert()它,如果它有透明度,则应.convert_alpha()它。这不仅带来了巨大的加速,而且解决了“为什么我的透明性会这样做?”的谜团。

    这似乎是一个pygame bug。哈。很高兴知道。这是一个已知的bug还是我应该填写bug报告?
    pygame.image.load('my_image.gif').convert_alpha()