如何在 Python 中压缩图像

2024年8月29日 | 阅读 7 分钟

本教程将教我们如何使用 Python 脚本压缩给定的图像。图像压缩是一个在不降低图像质量的情况下减小图像大小的过程。互联网上有很多工具,我们需要上传并压缩图像而不会丢失原始质量。如果我们想快速可靠地减小图像大小,它们大多数都是不错的选择。但是,我们不会使用任何第三方 API 来做到这一点。我们将在 Python 脚本中使用 Pillow 库。

让我们开始编写 Python 代码。

安装 Pillow 库

首先,我们使用 pip 命令安装 pillow 库。

安装库后,将其导入我们的文件。

在我们深入研究图像压缩之前,让我们创建一个以下函数,以用户友好的格式打印文件大小。

示例 -

现在我们将编写用于压缩图像的函数。让我们来理解下面的函数。

示例 -

让我们分解上面的函数并理解它是如何工作的。

在上面的代码中,我们创建了一个名为 compress_given_image() 的函数,该函数接受多个参数 -

  • 首先,我们使用 image.open() 函数将图像加载到内存中。我们使用 os.path.getsize() 获取图像大小,以便稍后可以将此大小与新生成的文件大小进行比较。
  • 我们使用条件语句,如果 new_size_ratio 低于 1.0,则必须执行重 sizing。这个数字的范围是 0 到 1,并乘以原始图像的宽度和高度,从而生成一个较低分辨率的图像。如果您想进一步减小图像大小,此参数非常合适。您也可以将其设置为 0.95 或 0.9,以在分辨率变化最小的情况下减小图像大小。
  • 如果 new_size_ratio 为 1,但 height 和 width 已设置,我们则将图像调整为新的 width 和 height 值。但我们需要确保它们应低于原始 widthheight。
  • 在以下条件中,我们检查 to_jpg 是否为 True,然后将原始图像的扩展名更改为 JPEG。这将大大减小图像大小,尤其是对于 PNG 图像。如果我们遇到 OSError,可以通过将图像格式转换为 RGB 来解决此问题。
  • 最后,我们使用 save() 方法写入优化后的图像,我们将 optimize 设置为 True,并将 quality 参数从函数传递过去。然后我们获取压缩图像的大小并将其与原始图像的大小进行比较。

现在我们在主函数中调用上面的函数,并将使用 argparse 模块将其与命令行参数集成。让我们来理解下面的代码。

在上面的代码中,我们创建了命令行参数解析器,并添加了我们之前讨论过的参数。让我们在命令行中运行我们的脚本。

完整脚本

现在在命令行终端中运行上面的脚本。

$ python main.py house.jpg

输出

==================================================
Image: house.jpg
To JPEG: False
Quality: 90
Resizing ratio: 1.0
==================================================
[*] The size of image: (275, 183)
[*] Size before compression: 180.94KB
 New file saved: house_compressed.jpg
Size after compression: 100.21KB
 Image size change: 47.81% of the original image size.

$ python main.py nature.jpg -j

输出

==================================================
Image: nature.jpg
To JPEG: True
Quality: 90
Resizing ratio: 1.0
==================================================
[*] The size of image: (612, 384)
[*] Size before compression: 80.67KB
 New file saved: nature_compressed.jpg
Size after compression: 73.37KB
 Image size change: 4.45% of the original image size.

$ python main.py sample_image.png -j -q 75

输出

==================================================
Image: sample_image.png
To JPEG: True
Quality: 75
Resizing ratio: 1.0
==================================================
[*] The size of image: (740, 935)
[*] Size before compression: 146.32KB
 New file saved: sample_image_compressed.jpg
Size after compression: 123.03KB
 Image size change: -15.92% of the original image size.

$ python main.py sample_image.png -j -q 75 -w 800 -hh 400

==================================================
Image: sample_image.png
To JPEG: True
Quality: 75
Resizing ratio: 1.0
Width: 800
Height: 400
==================================================
[*] The size of image: (740, 935)
[*] Size before compression: 146.32KB
main.py:34: DeprecationWarning: ANTIALIAS is deprecated and will be removed in Pillow 10 (2023-07-01). Use Resampling.LANCZOS instead.
  img = img.resize((image_width, height_width), Image.ANTIALIAS)
New Image shape: (800, 400)
 New file saved: sample_image_compressed.jpg
Size after compression: 61.76KB
 Image size change: -57.79% of the original image size.

结论

在本教程中,我们解释了如何通过 Python 脚本在恢复原始质量的同时减小图像。我们可以不使用任何第三方工具来压缩图像。您可以复制代码并在您的系统上运行。