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

时间:2014-01-12 19:39:15

标签: python pygame

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

  1. 为什么副本会失去透明度? docs声音如所有关于新曲面应该是相同的,但这显然不会发生

  2. 为什么一些图像而不是其他图像会发生这种情况?

  3. 这是一个示例“坏”图像 - 复制时,透明度丢失

    Bad image.

    以下是“好”图片示例 - 复制后,透明度丢失。

    Good image.

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

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

    哎呀,为了完成,这里是运行上面代码的截图。 Result of running the above code.

    请注意,我不寻找解决方法;我只是想知道我对surface.copy的理解,或者你认为我对使用Pygame曲面可能不了解的任何内容。

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

1 个答案:

答案 0 :(得分:0)

您需要使用.convert_alpha()

尝试:

pygame.image.load('my_image.gif').convert_alpha()

请参阅: http://www.pygame.org/docs/ref/surface.html#pygame.Surface.convert_alpha

“使用所需的像素格式创建曲面的新副本。新曲面将采用适合快速blitting到给定格式的格式,每像素alpha。如果没有给出曲面,新曲面将被优化用于blitting到当前显示。

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

在pygame的任何时候你加载和图像,或创建一个表面,意图显示它你应该.convert()如果它没有透明度,或.convert_alpha()如果它有透明度。这既产生了巨大的加速,又解决了“为什么我的透明度这样做?”的神秘感。