pygame图像处理之合成图片与缩放演示程序

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

 

哪吒png源图

太空png原图缩放与合成后的图 缩放与合成后的图