详解Python PIL Image.transform()方法

  • Post category:Python

Python PIL库 Image.transform()方法详解

概述

Python PIL(Python Imaging Library)是一个图像处理的Python库,提供了一些基本的图像处理功能,例如裁切、缩放、旋转等等。其中Image.transform()方法则是图片变换的方法之一。本文将深入探讨Image.transform()方法的实现机制、使用方法和示例等。

Image.transform()方法

Image.transform(method, size, data, resample=None, fill=None)

参数

  • method:变换的名称。可以是字符串 “IDENTITY”、”AFFINE”、”EXTENT”、”QUAD”、”MESH”、”PERSPECTIVE” 或 “BOX” 中的一个,或者是一个数字。数字 0 代表 “IDENTITY”,数字 1 代表 “AFFINE”。
  • size:输出图像的宽度和高度,必须是元组类型 (width, height)。
  • data:变换数据,根据方法的不同,data 的类型也分别不同。data 是元组或列表类型,根据具体的值意义进行填充。data 的长度也随着 method 的不同而不同。
  • resample:重新采样算法。可以是字符串 “NEAREST”、”BILINEAR”、”BICUBIC” 或 “ANTIALIAS” 中的一个,或者是一个数字。数字 0 代表 “NEAREST”。
  • fill:输出图像的背景颜色。可以是字符串 “black”、”white” 或任何值 或者是一个元组。

使用方法

1. 变换方法: IDENTITY

from PIL import Image

im = Image.open('input.jpg')

# 变换方法: IDENTITY
out = im.transform((im.size[0], im.size[1]), Image.IDENTITY)

out.show()

这段代码会将读取到的图片变为原始大小的输出,即不对图片做任何变换。

2. 变换方法: AFFINE

from PIL import Image

im = Image.open('input.jpg')

# 变换方法: AFFINE
data = (1, 0, 0, 0, 1, 0)
out = im.transform((im.size[0], im.size[1]), Image.AFFINE, data)

out.show()

这段代码会将读取到的图片按 data 中的矩阵进行仿射变换。(例如旋转、平移、缩放等)此处 data 中的值 (1, 0, 0, 0, 1, 0) 表示不做变换。

示例

我们有一张图片,需要将其按照以下方式进行变换:宽度放大一倍,高度缩小一半,然后以 (100, 100) 为中心进行旋转 45 度。

代码如下:

from PIL import Image

im = Image.open('input.jpg')
w, h = im.size

# 创建仿射变换矩阵
scale_x, scale_y = 2, 0.5
angle = 45
center_x, center_y = w/2, h/2
M = [scale_x * math.cos(angle), -math.sin(angle), center_x,
     math.sin(angle), scale_y * math.cos(angle), center_y]

# 变换方法: AFFINE
data = tuple(M)
resample = Image.NEAREST
out = im.transform((w, h), Image.AFFINE, data, resample=resample)

out.show()

这段代码先创建了一个 (2, 0.5) 的矩阵,用于对图片进行变换;然后将这个矩阵传入Image.transform()函数,完成了图片的变换。

另外一个示例:生成一个DPI为72的空图像,大小为100*100,背景颜色为白色。

from PIL import Image

# 创建空图像 Image.new(mode, size, color) 
size = (100, 100)
color = (255, 255, 255)
im = Image.new(mode='RGB', size=size, color=color)

# 调整图像DPI Image.transform()
dpi = (72, 72)
out = im.transform(size, Image.EXTENT, (0, 0, 0, 0), resample=Image.NEAREST, fill='black')

out.show()

这段代码先创建了一个大小为(100, 100)的白色的空图像,然后使用Image.transform()函数将其转换为DPI为72的图像,并将背景颜色设为黑色,最后输出图片。

结语

Image.transform()方法是Python PIL库中的一个非常有用的图像变换方法,经过本文的介绍,相信读者已经能够轻松上手。如果您在使用中遇到其他问题,欢迎留言讨论,我会尽力给出帮助。