Pygame - 影像變換



pygame.transform 模組包含許多函式的定義,用於操作從影像或文字塊獲得的 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() 查詢 surface 中的邊緣
average_surfaces() 從多個 surface 中查詢平均 surface。
average_color() 查詢 surface 的平均顏色
threshold() 查詢 surface 中哪些畫素以及有多少畫素在“search_color”或“search_surf”的閾值範圍內。

讓我們首先使用 flip() 函式,其語法如下:

flip(Surface, xbool, ybool)

此函式可以水平、垂直或同時翻轉 surface 物件。方向由兩個布林引數決定。

要水平翻轉影像,請使用以下命令:

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 徽標及其翻轉影像的完整程式碼如下:

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

輸出

Original Pygame

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

輸出

Originals Pygame

示例

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 Object

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

輸出

執行上述程式碼,嘗試沿顯示視窗移動滑鼠游標。影像將相應地旋轉並縮小或放大。

Mouse Cursor
廣告