Pygame有Surface类,它用来实例化存储在内存中的图形。如果要加载外部的图像,可以用pygame.image.load命令,它返回的是surface。
由于Pygame的surface提供了一套方法可以操作surface,如设置透明度,缩放,旋转,甚至对它直接进行像素级操作,所以可以做图形处理。我们加载两张图片,把它们合成,那么新的图片就出来了。以下是把名为“太空.png“的和名为”nezha.png”的图片进行合成的最简单示例,方便理解。
"""pygame最简单的合成与透明度演示程序""" import pygame # 导入pygame模块 pygame.init() screen = pygame.display.set_mode((1,1)) # 新建屏幕对象 background = pygame.image.load("太空.png").convert() #转换成透明度图 nezha = pygame.image.load("nezha.png") # 加载哪吒图 nezha.set_alpha(100) # 设置合成图像时,它的alpha值 background.blit(nezha,(100,0)) # 把nezha贴到(100,0)坐标 pygame.image.save(background,"bg.png") # 保存图形 pygame.quit()
当两张图像合成一张图片时,每个像素是由每张图片的像素合成的。上面的程序中nezha的alpha值为100,这表示它和另一个图像合成时,它贡献100/256比例的像素值,而另一个图像将使用155/256的比例。如果它的alpha值是0,它合成到另一个图像上,它将是透明的。如果它的alpha值是255,则它是不透明的,完全覆盖在另一张图片上。为了理解,我们来估个试验。
下面的screen 由 pygame.display.set_mode((100,100))建立。我们把它填充为红色。image1是一个蓝色的图形。通过image1.set_alpha能设置它在合成时所贡献的像素比值。如果它的值是0,它将不贡献一点像素,这时屏幕会显示纯红色,如果它的值在0到255之间,它会贡献相应比例的像素值。如果它是255,它所占的比例就是100%。这时就是纯蓝色了。运行下面的程序,屏幕会从红色快速地过度到蓝色。也即image1会从完全透明过度到不透明。
"""pygame的surface设置alpha试验""" import pygame pygame.init() screen = pygame.display.set_mode((100,100)) screen.fill((255,0,0)) # screen是红色的 image1 = pygame.Surface((100,100)) image1.fill((0,0,255)) # 下面让屏幕从红色显示到蓝色 for a in range(0,256): # 值从0到255变化 image1.set_alpha(a) # 设置合成时的alpha值 screen.blit(image1,(0,0)) # 合成到screen print(screen.get_at((0,0)))# 打印screen左上角像素值 pygame.display.update() # 刷新显示 screen.fill((255,0,0)) # 让screen的颜色回到红色
刚才说了Surface类提供了方法可以对图像进行缩放,下面的例子对图像进行了缩放。
""" pygame合成图片与缩放演示程序。 """ nezhas = [] import pygame # 导入pygame模块 pygame.init() # pygame初始化 screen = pygame.display.set_mode((1,1)) # 新建屏幕对象 background = pygame.image.load("太空.png").convert_alpha() bgheight = background.get_height() # 获取背景高度 nezha = pygame.image.load("nezha.png") # 加载哪吒图 nezha_width = nezha.get_width() # 获取宽度 nezha_height = nezha.get_height() # 获取高度 k = nezha_height / nezha_width # 高度和宽度的比值 background.blit(nezha,(0,bgheight-nezha_height)) # 把nezha图放在background左下角 for width in range(10,420,50): print(width) height = int(width * k) n = pygame.transform.scale(nezha,(width,height)) # 缩放图形 n.set_alpha(width//2) # 设置透明度 background.blit(n,(width*2,250)) # 贴一张图到background上 pygame.image.save(background,"combine.png") # 保存图像 pygame.quit() # 退出pygame