Pillow支持各种图像文件格式,如PNG、JPEG、PPM、GIF、TIFF和BMP。 Pillow支持裁剪、调整大小、为图像添加文本、旋转和灰度等操作。
如何在Python中调整图像的大小
要在Python中调整 图像的大小,可以使用**Pillow成像库的resize()**方法。Pillow是Python成像库(PIL)的分叉。PIL是提供几个处理图像的标准程序的库。
在Instagram的时代,数字图像是主要的资产。如果你正在用Python构建一个网络应用,并希望添加图像处理功能,你可以使用不同的库。一些流行的库是OpenCV、scikit-image、Python Imaging Library和Pillow。
在Python中调整图像大小的步骤
要在Python中调整图像的大小:
- 安装Pillow。
- 从PIL导入图像类并打开图像。
- 使用resize()方法调整图像的大小。
- 可选的步骤:你可以使用thumbnail()方法来调整图像的大小。
步骤1:安装Pillow
在安装Pillow之前,必须满足一些先决条件。这些对于不同的操作系统是不同的。
我们不会在这里列出不同的选项,你可以在这个安装指南中找到你的特定操作系统的后设。
在安装完所需的库后,你可以用`pip.Pillow'安装Pillow。
键入以下命令:
python3 -m pip install pillow
# OR
pip install pillow
PIL是Python成像库,它为python解释器提供了图像编辑功能。
Image模块提供了用于表示PIL图像的同名类。该模块还提供了几个工厂功能,包括从文件中加载图像和创建新图像。
步骤2:导入PIL并打开图像
要从PIL中导入图像类:
from PIL import Image
图像对象
Python 图像库中的一个重要类是 Image 类。
它被定义在一个图像模块中,支持一个可以进行编辑操作的PIL图像。
图像类的一个实例(对象)可以通过以下方式之一创建:
- 通过从文件中加载图像。
- 从头开始创建图像。
- 作为处理其他图像的结果。
为了从文件系统中加载图像,我们使用图像模块的open()方法,并传递图像的路径。请看下面的代码:
from PIL import Image
try:
imgPath = './forest.jpg'
img = Image.open(imgPath)
img.show()
except FileNotFoundError:
print('Provided image path is not found')
输出
在获得图像对象后,你现在可以使用该类定义的方法和属性来处理和操作它。
让我们从显示图像开始。你可以通过对获得的对象调用show()方法来显示图像。show()方法在外部查看器上显示图像。例如,在macOS上,它是在预览软件上打开的。
如果我们提供的路径不正确,那么它将抛出一个FileNotFoundError异常。我们在代码中通过在控制台打印消息来处理这个异常。
图像对象属性
你可以使用图像对象的属性来获得一些关于图像的信息。
如果你想获得源图像的格式,那么你可以使用image.format()函数。
如果你想得到源图像的模式,那么你可以使用image.mode()函数。
如果你想获得源图像的大小,那么你可以使用image.size()函数。
如果你想获得源图像的调色板,那么你可以使用image.palette()函数。
from PIL import Image
try:
imgPath = './forest.jpg'
img = Image.open(imgPath)
print('The format of img is: ', img.format)
print('The mode of img is: ', img.mode)
print('The size of img is: ', img.size)
print('The palette of img is: ', img.palette)
except FileNotFoundError:
print('Provided image path is not found')
输出结果
The format of img is: JPEG
The mode of img is: RGB
The size of img is: (4000, 6000)
The palette of img is: None
你可以在输出中看到,现在,源图像的大小是:(4000,6000)。 调整图像大小后,它将会有所不同。
步骤3:调整图像的大小
要调整图像的大小,你必须在图像对象上调用resize()方法,并传入代表调整后图像的宽度和高度的两个整数参数。
resize()函数并不修改使用的图像。相反,它返回另一个具有新尺寸的图像。
Image.resize()方法返回源图像的一个调整后的副本。
语法
Image.resize(size, resample=0)
参数
大小:请求的尺寸,以像素为单位,是一个元组:(宽度,高度)。
resample:一个可选的重采样过滤器。这可以是以下方式之一:
- PIL.Image.NEAREST (使用最近的邻居)。
- PIL.Image.BILINEAR(线性内插)。
- PIL.Image.BICUBIC(三维样条插值),或
- PIL.Image.LANCZOS(一个高质量的下采样滤波器)。如果被排除或者图像有模式 "1 "或 "P",它将被设置为PIL.Image.NEAREST。
返回值
Image.resize()方法返回源图像的一个调整后的副本:
from PIL import Image
try:
imgPath = './forest.jpg'
img = Image.open(imgPath)
print('The size of img is: ', img.size)
print('After applying resize() function')
resizedImage = img.resize((400, 400))
print('The size of resizedImage is: ', resizedImage.size)
resizedImage.show()
except FileNotFoundError:
print('Provided image path is not found')
输出
The size of img is: (4000, 6000)
After applying resize() function
The size of resizedImage is: (400, 400)
resize()方法返回宽度和高度与传入值一致的图像。
这可能是你想要的,但有时你可能会发现由resize()函数返回的图像并不理想。
这主要是因为该方法没有考虑到图像的长宽比,所以你最终可能得到一个看起来被拉伸或被压扁的图像。
在Python中对图像重新取样
image.resize()方法还需要一个叫resample的参数。
重采样是一种方法,包括从原始数据样本中抽取重复的样本。
重采样的方法是统计推理的非参数方法。
换句话说,重采样方法不涉及使用通用分布表(例如,正态分布表)来计算近似的P概率值。
我们可以在重采样参数中传递以下数值之一:
- PIL.Image.NEAREST (使用最近的邻居)。
- PIL.Image.BILINEAR(线性内插)。
- PIL.Image.BICUBIC(三维样条插值),或
- PIL.Image.LANCZOS(一个高质量的下采样滤波器)。如果省略或图像有模式 "1 "或 "P",则被设置为PIL.Image.NEAREST。
请看下面的代码:
from PIL import Image
try:
imgPath = './forest.jpg'
img = Image.open(imgPath)
img.show()
print('The size of img is: ', img.size)
print('After applying resize() function')
resizedImage = img.resize((400, 400), resample=Image.NEAREST)
print('The size of resizedImage with resampling: ', resizedImage.size)
resizedImage.show()
except FileNotFoundError:
print('Provided image path is not found')
输出
The size of img is: (4000, 6000)
After applying resize() function
The size of resizedImage with resampling: (400, 400)
你可以看到图像被重新取样后调整了大小。
在Python中使用Pillow创建一个缩略图
要调整图像的大小并保持其长宽比不变,那么你应该使用thumbnail() 函数来调整它们的大小,而不是使用resize()函数。
这也需要代表缩略图最大宽度和最大高度的两个整数的参数。
请看下面的代码来创建一个缩略图并将其保存到文件系统中。
from PIL import Image
try:
imgPath = './forest.jpg'
img = Image.open(imgPath)
print('The size of img is: ', img.size)
print('After applying thumbnail() function')
img.thumbnail((400, 400))
img.save('image_thumbnail.jpg')
print('The size of thumbnail image is: ', img.size)
except FileNotFoundError:
print('Provided image path is not found')
输出
The size of img is: (4000, 6000)
After applying thumbnail() function
The size of thumbnail image is: (267, 400)
以上将输出一个尺寸为267×400的图像,并保持了原始图像的长宽比。
resize()与thumbnail()的区别
resize()和thumbnail()方法的显著区别是,如果给定的参数比原始图像大,resize()函数会 "吹掉"图像,而thumbnail()函数则不会。
例如,给定尺寸为400×200的图像,调用resize((1200, 600))将创建更大尺寸的图像1200×600。因此,图像将失去一些清晰度,并且与原始图像相比,可能是模糊的。
另一方面,使用原始图像调用thumbnail((1200, 600))将导致图像保持400×200的大小,因为其宽度和高度都小于指定的最大宽度和高度。
总结
在这个例子中,我们已经看到了以下几点:
- 如何安装Pillow并从PIL模块中导入Image模块。
- 然后我们看到了图像对象和属性。
- 接下来,我们看到了如何使用重采样的resize()函数来调整图像的大小。
- 最后,我们看到了如何使用thumbnail()函数以及resize()和thumbnail()的区别。
就这样了。


