Pygame - 转换图像
pygame.ransform 模块包含许多函数的定义,用于操作从图像或文本块中获得的 Surface 对象。 对 Surface 的操纵包括翻转、旋转、缩放、调整大小和缩放对象。
在 pygame.transform 模块中可以找到以下函数。
| flip() | 垂直和水平翻转 |
| scale() | 调整到新分辨率 |
| rotate() | 旋转图片 |
| rotozoom() | 过滤缩放和旋转 |
| scale2x() | 专用图像倍增器 |
| smoothscale() | 平滑地将 Surface 缩放到任意大小 |
| get_smoothscale_backend() | 返回正在使用的 smoothscale 过滤器版本 - 'GENERIC'、'MMX' 或 'SSE' |
| set_smoothscale_backend() | 将 smoothscale 过滤器版本设置为"GENERIC"、"MMX"或"SSE"之一 |
| chop() | 获取删除了内部区域的图像副本 |
| laplacian() | 寻找曲面中的边 |
| average_surfaces() | 从多个曲面中找出平均曲面。 |
| average_color() | 求一个 Surface 的平均颜色 |
| threshold() | 查找 Surface 中哪些像素以及有多少像素在"search_color"或"search_surf"的阈值内。 |
让我们先使用flip()函数,其语法如下 −
flip(Surface, xbool, ybool)
此函数可以水平、垂直或同时翻转 Surface 对象。 方向由两个 bool 参数决定。
要水平翻转图像,使用以下命令 −
pygame.transform.flip(img2,True, False)
要垂直翻转,使用以下命令 −
pygame.transform.flip(img2,False, True)
在下面的示例中,pygame 徽标图像正常显示并双向翻转。 首先从原始图像对象中获取翻转 Surface ,获取其 Rect 对象,然后构建它。 要渲染水平翻转的图像,
img1 = pygame.image.load('pygame.png')
img2=img1
img2=pygame.transform.flip(img2,True, False)
#inside event loop
rect2 = img2.get_rect()
rect2.center = 200, 150
screen.blit(img2, rect2)
示例
渲染原始Pygame logo及其翻转图像的完整代码如下 −
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Flip image")
img1 = pygame.image.load('pygame.png')
img2=img1
img3=img1
img2=pygame.transform.flip(img2,True, False)
img3=pygame.transform.flip(img3, False, True)
done = False
bg = (127,127,127)
while not done:
for event in pygame.event.get():
screen.fill(bg)
rect1 = img1.get_rect()
rect1.center = 200, 50
screen.blit(img1, rect1)
rect2 = img2.get_rect()
rect2.center = 200, 150
screen.blit(img2, rect2)
rect3 = img3.get_rect()
rect3.center = 200, 250
screen.blit(img3, rect3)
if event.type == pygame.QUIT:
done = True
pygame.display.update()
输出
rotate() 函数接受以下参数 −
rotate(Surface, angle)
示例
角度为负值时,Surface 顺时针旋转。
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("rotate image")
img1 = pygame.image.load('pygame.png')
img2=img1
img3=img1
img2=pygame.transform.rotate(img2,90)
img3=pygame.transform.rotate(img3, -90)
done = False
bg = (127,127,127)
while not done:
for event in pygame.event.get():
screen.fill(bg)
rect1 = img1.get_rect()
rect1.center = 200, 50
screen.blit(img1, rect1)
rect2 = img2.get_rect()
rect2.center = 100, 200
screen.blit(img2, rect2)
rect3 = img3.get_rect()
rect3.center = 300,200
screen.blit(img3, rect3)
if event.type == pygame.QUIT:
done = True
pygame.display.update()
输出
示例
laplacian() 函数提取 Surface 对象的轮廓。 该函数只接受一个参数,即图像对象本身。
import pygame
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Laplacian of image")
img1 = pygame.image.load('pygame.png')
img2=img1
img2=pygame.transform.laplacian(img2)
done = False
bg = (127,127,127)
while not done:
for event in pygame.event.get():
screen.fill(bg)
rect1 = img1.get_rect()
rect1.center = 200, 50
screen.blit(img1, rect1)
rect2 = img2.get_rect()
rect2.center = 200, 200
screen.blit(img2, rect2)
if event.type == pygame.QUIT:
done = True
pygame.display.update()
输出
要使 Surface 对象随着鼠标移动而移动,请从图像中心计算 x、y 坐标。 我们还计算中心鼠标距离 d。 atan2(y, x) 数学函数允许找到旋转角度。 我们需要以度为单位转换弧度。 我们从鼠标中心的距离计算比例参数。
mouse = event.pos Pygame 54 x = mouse[0] - 200 y = mouse[1] - 150 d = math.sqrt(x ** 2 + y ** 2) angle = math.degrees(-math.atan2(y, x)) scale = abs(5 * d / 400)
最后,我们使用 rotzoom() 函数执行组合旋转和缩放变换。
rotozoom(Surface, angle, scale)
示例
以下代码呈现可根据鼠标移动旋转的 Pygame 徽标图像。
import pygame , math
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((400, 300))
pygame.display.set_caption("Move image with mouse")
img1 = pygame.image.load('pygame.png')
done = False
bg = (127,127,127)
while not done:
for event in pygame.event.get():
screen.fill(bg)
if event.type == pygame.QUIT:
done = True
if event.type == MOUSEMOTION:
mouse = event.pos
x = mouse[0] - 200
y = mouse[1] - 150
d = math.sqrt(x ** 2 + y ** 2)
angle = math.degrees(-math.atan2(y, x))
scale = abs(5 * d / 400)
img2 = pygame.transform.rotozoom(img1, angle, scale)
rect = img2.get_rect()
rect.center = (200,150)
screen.blit(img2, rect)
pygame.display.update()
输出
运行上面的代码,尝试沿着显示窗口移动鼠标光标。 图像应旋转并相应地缩小或增大。

