如何使用Python和PIL压缩图像?

Python和PIL简介

Python是一种面向对象、解释型计算机程序设计语言,也是一种高级语言。Python以其简洁易读的语法、丰富的库和生态圈而备受关注。它被广泛应用于Web开发、数据分析、人工智能等领域。

Python Imaging Library(PIL)是一个Python图像处理库,提供了图像的基本操作、格式转换、滤镜、图像增强等功能。

安装Pillow模块

因为PIL库已经过时,我们可以使用其分支Pillow库,下面介绍如何安装Pillow库。

在命令行中输入以下命令:

pip install Pillow

安装成功后,我们可以导入Pillow库并测试它是否安装正确,使用以下代码:

from PIL import Image

im = Image.open("example.jpg")

im.show()

好了,这一步我们也完成了。

读取图像并压缩

读取图像

使用Image模块的open()方法可以读取一张图片,并返回一个Image对象。如以下代码:

from PIL import Image

im = Image.open("example.jpg")

压缩图像

要压缩图像,我们需要先进行一些设置。以下是我们要使用的设置:

quality: JPEG格式存储时的图像质量,值范围为0到100,其中0表示最差的质量,100表示最好的质量。

optimize: 是否自动优化存储(仅对JPEG格式有效)。

compress_level: PNG格式存储时的压缩级别,值范围为0到9,其中0表示没有压缩,9表示最高级别的压缩。

temperature: 模糊的程度。

我们接下来使用图片压缩的代码:

from PIL import Image

im = Image.open("example.jpg")

im.save("example_compressed.jpg", optimize=True, quality=50)

以上代码中,我们将原始图像压缩并将其保存为新的文件。

代码分析和优化

在图像处理中,压缩算法通常是很耗费时间的,因此需要考虑一些优化手段。

我们可以使用多线程来处理大批量的图像,加速处理。下面的代码展示了如何使用多线程来压缩图像。请注意(-1)参数,它使用系统中可用的所有核。我们还使用ThreadPoolExecutor模块来创建多线程。

import os

from concurrent.futures import ThreadPoolExecutor

from PIL import Image

def compress_image(image_path, output_path, quality, optimize, compress_level):

im = Image.open(image_path)

im.save(output_path, optimize=optimize, quality=quality, compress_level=compress_level)

def multi_thread_compress_images(input_folder, output_folder, quality, optimize, compress_level, temperature):

executor = ThreadPoolExecutor(-1)

futures = []

for root, _, filenames in os.walk(input_folder):

for filename in filenames:

input_path = os.path.join(root, filename)

output_path = os.path.join(output_folder, filename)

futures.append(executor.submit(compress_image, input_path, output_path, quality, optimize, compress_level, temperature))

for future in futures:

future.result()

if __name__ == '__main__':

multi_thread_compress_images('input', 'output', quality=50, optimize=True, compress_level=6)

在上面的代码中,我们首先定义了一个函数compress_image(),它使用指定的参数压缩图像。

接下来,我们定义了一个函数multi_thread_compress_images(),它使用多线程来压缩输入目录中的所有图像,并将它们保存到输出目录中。使用os库的walk()方法获得输入目录中的所有图像的列表,并为每个图像创建一个ThreadPoolExecutor对象,将它们添加到Executor队列中。

在最后一步中,我们等待所有任务完成。

总结

在这篇文章中,我们介绍了Python图像处理库Pillow,并学习了如何使用它来读取和压缩图像。我们还讨论了如何使用多线程来压缩大批量的图像。使用多线程可以极大地加速图像处理的速度,特别是在处理大量图像时。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签