Pygame 图像变换

Pygame 图像变换

pygame.transform 模块包含一些用于操作从图像或文本生成的 Surface 对象的函数定义。对于一个表面对象的操作包括翻转、旋转、缩放、调整大小和缩放。

以下函数可以在 pygame.transform 模块中找到。

flip() 垂直和水平翻转
scale() 调整为新分辨率大小
rotate() 旋转图像
rotozoom() 过滤的缩放和旋转
scale2x() 专用图像放大器
smoothscale() 平滑地将表面缩放到任意大小
get_smoothscale_backend() 返回正在使用的平滑缩放过滤器版本 – ‘GENERIC’、’MMX’或’SSE’
set_smoothscale_backend() 将平滑缩放过滤器版本设置为’GENERIC’、’MMX’或’SSE’之一
chop() 获得一个删除了内部区域的图像副本
laplacian() 在表面中找到边缘
average_surfaces() 从多个表面中找到平均表面。
average_color() 找到表面的平均颜色
threshold() 找到表面中在 ‘search_color’ 或 ‘search_surf’ 的阈值范围内的像素点,并计算其数量

让我们首先使用flip()函数,其语法如下所示:-

flip(Surface, xbool, ybool)

此函数可以水平、垂直或同时翻转表面对象。方向由两个布尔参数决定。

要水平翻转图像,请使用以下命令−

pygame.transform.flip(img2,True, False)

要垂直翻转,请使用以下命令 –

pygame.transform.flip(img2,False, True)

在以下示例中,pygame标志图像以正常和两个方向上翻转的方式显示。首先从原始图像对象获取翻转后的表面,然后获取其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标志及其翻转图像的完整代码如下所示−

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

输出

Pygame 图像变换

rotate()函数接受以下参数:

rotate(Surface, angle)

示例

角度的负值会顺时针旋转物体表面。

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

输出

Pygame 图像变换

示例

laplacian()函数提取表面对象的轮廓。该函数只需要一个参数,即图像对象本身。

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

输出

Pygame 图像变换

为了使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()

输出

运行上述代码,试着将鼠标光标沿着显示窗口移动。图像将会根据鼠标的移动而旋转并且缩小或放大。

Pygame 图像变换

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程