对于某些(但不是全部!)图像,使用surface.copy()
复制曲面会失去透明度。所以我有两个问题?
为什么副本会失去透明度? docs声音如所有关于新曲面应该是相同的,但这显然不会发生
为什么一些图像而不是其他图像会发生这种情况?
这是一个示例“坏”图像 - 复制时,透明度丢失
以下是“好”图片示例 - 复制后,透明度不丢失。
以下是您可以运行以查看差异的代码:
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曲面可能不了解的任何内容。
我在Windows 7机器上使用Python 3.3和Pygame 1.9.2pre。
答案 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()如果它有透明度。这既产生了巨大的加速,又解决了“为什么我的透明度这样做?”的神秘感。