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,并学习了如何使用它来读取和压缩图像。我们还讨论了如何使用多线程来压缩大批量的图像。使用多线程可以极大地加速图像处理的速度,特别是在处理大量图像时。