如何在Python中调整图像的大小(附代码)

836 阅读7分钟

Pillow支持各种图像文件格式,如PNG、JPEG、PPM、GIF、TIFF和BMP。 Pillow支持裁剪、调整大小、为图像添加文本、旋转和灰度等操作。

如何在Python中调整图像的大小

要在Python调整 图像大小,可以使用**Pillow成像库的resize()**方法。Pillow是Python成像库(PIL)的分叉。PIL是提供几个处理图像的标准程序的库。

在Instagram的时代,数字图像是主要的资产。如果你正在用Python构建一个网络应用,并希望添加图像处理功能,你可以使用不同的库。一些流行的库是OpenCVscikit-imagePython Imaging LibraryPillow

在Python中调整图像大小的步骤

要在Python中调整图像的大小

  1. 安装Pillow。
  2. 从PIL导入图像类并打开图像。
  3. 使用resize()方法调整图像的大小。
  4. 可选的步骤:你可以使用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图像。

图像类的一个实例(对象)可以通过以下方式之一创建:

  1. 通过从文件中加载图像。
  2. 从头开始创建图像。
  3. 作为处理其他图像的结果。

为了从文件系统中加载图像,我们使用图像模块的open()方法,并传递图像的路径。请看下面的代码:

from PIL import Image

try:
    imgPath = './forest.jpg'
    img = Image.open(imgPath)
    img.show()
except FileNotFoundError:
    print('Provided image path is not found')

输出

Resize Image in Python

在获得图像对象后,你现在可以使用该类定义的方法和属性来处理和操作它。

让我们从显示图像开始。你可以通过对获得的对象调用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:一个可选的重采样过滤器。这可以是以下方式之一:

  1. PIL.Image.NEAREST (使用最近的邻居)。
  2. PIL.Image.BILINEAR(线性内插)。
  3. PIL.Image.BICUBIC(三维样条插值),或
  4. 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)

Resized Image

resize()方法返回宽度和高度与传入值一致的图像。

这可能是你想要的,但有时你可能会发现由resize()函数返回的图像并不理想。

这主要是因为该方法没有考虑到图像的长宽比,所以你最终可能得到一个看起来被拉伸或被压扁的图像。

在Python中对图像重新取样

image.resize()方法还需要一个叫resample的参数。

重采样是一种方法,包括从原始数据样本中抽取重复的样本。

重采样的方法是统计推理的非参数方法。

换句话说,重采样方法不涉及使用通用分布表(例如,正态分布表)来计算近似的P概率值。

我们可以在重采样参数中传递以下数值之一:

  1. PIL.Image.NEAREST (使用最近的邻居)。
  2. PIL.Image.BILINEAR(线性内插)。
  3. PIL.Image.BICUBIC(三维样条插值),或
  4. 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)

Resampling the image in Python

你可以看到图像被重新取样后调整了大小。

在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的大小,因为其宽度和高度都小于指定的最大宽度和高度。

总结

在这个例子中,我们已经看到了以下几点:

  1. 如何安装Pillow并从PIL模块中导入Image模块。
  2. 然后我们看到了图像对象和属性。
  3. 接下来,我们看到了如何使用重采样的resize()函数来调整图像的大小。
  4. 最后,我们看到了如何使用thumbnail()函数以及resize()和thumbnail()的区别。

就这样了。