详解如何使用Python和PIL来压缩图像

  • Post category:Python

下面是基于Python和PIL库来压缩图像的完整攻略。

1. 安装PIL库

PIL库是Python中常用的处理图像的库,具有丰富的功能,包括图像的读取、修改、保存等。在使用PIL库之前需要先安装。

使用 pip 命令进行安装,命令如下:

pip install pillow

2. 加载和打开图片

使用PIL库打开图片,代码如下:

from PIL import Image

def load_image(filepath):
    '''
    加载图片
    :param filepath: 图片文件路径
    :return: Image对象
    '''
    with open(filepath, 'rb') as f:
        image = Image.open(f)
        return image

其中 load_image(filepath) 函数用来加载图片,参数 filepath 为图片文件路径,返回一个 Image 对象。

3. 压缩图片

PIL库中的 Image 对象有一个 thumbnail(size, resample=3) 方法,可以用来压缩图片。其中 size 为元组类型,表示压缩后的图片大小, resample 表示压缩方法,默认值为3,此处不作过多介绍。

下面是一个简单的例子,将图片压缩为宽度和高度缩小一半的大小:

from PIL import Image

def load_image(filepath):
    '''
    加载图片
    :param filepath: 图片文件路径
    :return: Image对象
    '''
    with open(filepath, 'rb') as f:
        image = Image.open(f)
        return image

def compress_image(image, output_path):
    '''
    压缩图片
    :param image: Image对象
    :param output_path: 压缩后的图片保存路径
    '''
    # 获取压缩后的大小
    size = (image.width // 2, image.height // 2)
    # 压缩图片
    image.thumbnail(size)
    # 保存图片
    with open(output_path, 'wb') as f:
        image.save(f)

其中 compress_image() 函数用来压缩图片,参数 image 为要压缩的 Image 对象,参数 output_path 表示压缩后的图片保存路径。

示例1:压缩单张图片

image_path = 'test.jpg'
image = load_image(image_path)
output_path = 'test_compressed.jpg'
compress_image(image, output_path)

以上代码压缩名为 test.jpg 的图片,并将压缩后的图片保存到 test_compressed.jpg。

示例2:批量压缩图片

import os

def compress_images_in_folder(folder, output_folder):
    '''
    批量压缩图片
    :param folder: 原始图片所在文件夹路径
    :param output_folder: 压缩后的图片保存文件夹路径
    '''
    # 遍历原始图片所在文件夹
    for filename in os.listdir(folder):
        image_path = os.path.join(folder, filename)
        # 判断是否是图片文件
        if not os.path.isfile(image_path) or not image_path.endswith(('.jpg', '.jpeg')):
            continue
        # 加载图片
        image = load_image(image_path)
        # 获取输出文件路径
        output_path = os.path.join(output_folder, filename)
        # 压缩图片
        compress_image(image, output_path)

以上代码用来批量压缩一个文件夹中的图片,并将压缩后的图片保存到另一个文件夹中。其中 compress_images_in_folder() 函数用来压缩指定文件夹中的所有图片,参数 folder 表示原始图片所在文件夹路径,参数 output_folder 表示压缩后的图片保存文件夹路径。