Python使用Pillow实现图片压缩工具教程

一颗松果
一颗松果
发布时间:2026-10-11 | 1人浏览过
原创

本文介绍如何使用 Python 结合 Pillow 库快速搭建图片压缩工具,涵盖指定质量压缩、批量文件夹处理及按目标文件大小自适应调节等实用场景。通过清晰的操作步骤与完整代码示例,帮助开发者在保留视觉质量的前提下有效降低图片存储占用与加载耗时。

环境配置与依赖安装

在使用 Python 进行图片压缩前,需确保运行环境已安装必要的图像处理组件与进度反馈工具。Pillow 是 Python 生态中最常用的图像读写与处理库,tqdm 则用于在命令行终端直观展示循环处理的进度条。

第1步:安装核心依赖包

目的:获取图像处理能力与进度可视化支持。
入口:系统终端或命令行窗口
动作:执行 pip 包管理器安装命令
参数:Pillow、tqdm
完成状态:命令行返回 Successfully installed 提示,且可在 Python 脚本中无报错导入模块。

pip install Pillow tqdm

基础单图压缩流程

针对单张或少量图片的处理场景,核心逻辑是通过控制编码器的质量参数(Quality)来平衡视觉损失与文件体积。Pillow 默认将数值映射为 0~100 的压缩等级,数值越低体积越小但噪点越明显。

第2步:构建质量参数化压缩函数

目的:封装通用的单图转换逻辑,支持灵活的质量调节。
入口:Python 脚本文件
动作:定义接收输入路径、输出路径与质量参数的函数,调用 Image.open 读取文件,使用 save 方法重新编码保存。
重要参数:quality=80(经验值,兼顾清晰度与体积)
完成状态:函数返回 True 且目标路径生成对应尺寸的输出文件。

from PIL import Image
import os

def compress_image(input_path, output_path, quality=80):
    """
    压缩图片的函数

    :param input_path: 输入图片文件路径
    :param output_path: 输出图片文件路径
    :param quality: 图片质量(0-100),默认为80
    """
    try:
        # 打开输入图片
        with Image.open(input_path) as img:
            # 保存为输出图片(JPG格式),设置质量
            img.save(output_path, "JPEG", quality=quality)
        return True
    except Exception as e:
        print(f"压缩图片时出错:{e}")
        return False

# 示例用法
input_image = "input.jpg"
output_image = "output.jpg"
compress_image(input_image, output_image, quality=60)

批量目录高效处理

在实际开发或运维工作中,通常需要一次性清理整个媒体资源目录。配合 tqdm 可实时观察处理速度,避免长时间无响应的等待焦虑。

第3步:遍历文件夹并显示进度

目的:实现多文件自动化处理与异常隔离。
入口:Python 脚本文件
动作:创建输出目录,过滤特定后缀名,使用 tqdm 包裹循环迭代。
重要参数:exist_ok=True(防止目录已存时报错)
完成状态:控制台显示实时进度条,所有成功处理的文件同步至输出目录,失败文件打印错误日志且不中断后续任务。

from PIL import Image
import os
from tqdm import tqdm

def batch_compress_images(input_folder, output_folder, quality=80):
    """
    批量压缩图片的函数

    :param input_folder: 输入图片文件夹路径
    :param output_folder: 输出图片文件夹路径
    :param quality: 图片质量(0-100),默认为80
    """
    # 创建输出文件夹
    os.makedirs(output_folder, exist_ok=True)
    
    # 获取输入文件夹中的所有图片文件
    image_files = [f for f in os.listdir(input_folder) if f.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp'))]
    
    for image_file in tqdm(image_files, desc="压缩进度"):
        try:
            input_path = os.path.join(input_folder, image_file)
            output_path = os.path.join(output_folder, image_file)
            
            # 压缩图片
            compress_image(input_path, output_path, quality)
        except Exception as e:
            print(f"处理图片 {image_file} 时出错:{e}")

# 示例用法
input_folder = "input_images"
output_folder = "output_images"
batch_compress_images(input_folder, output_folder, quality=60)

按目标体积自适应压缩

部分业务场景要求严格控制单张图片的云端流量或数据库配额。此时需要根据目标大小动态回退质量参数,直到满足体积限制为止。

第4步:动态迭代调节压缩参数

目的:自动寻找质量与大小的最优平衡点。
入口:Python 脚本文件
动作:计算原始体积,进入 while 循环尝试降级压缩,每次将结果暂存至输出目录临时文件,校验达标后正式重命名移动。
重要参数:target_size_kb、质量步进 -10、防死循环阈值 <10
完成状态:输出目录中的文件体积 ≤ 设定值,或达到最低画质阈值后停止尝试。

from PIL import Image
import os
from tqdm import tqdm

def auto_compress_images(input_folder, output_folder, target_size_kb):
    """
    自动选择压缩质量以达到目标文件大小的函数

    :param input_folder: 输入图片文件夹路径
    :param output_folder: 输出图片文件夹路径
    :param target_size_kb: 目标文件大小(KB)
    """
    # 创建输出文件夹
    os.makedirs(output_folder, exist_ok=True)
    
    # 获取输入文件夹中的所有图片文件
    image_files = [f for f in os.listdir(input_folder) if f.endswith(('.jpg', '.jpeg', '.png', '.gif', '.bmp'))]
    
    for image_file in tqdm(image_files, desc="压缩进度"):
        try:
            input_path = os.path.join(input_folder, image_file)
            output_base = os.path.splitext(os.path.basename(input_path))[0]
            
            # 初始化质量
            quality = 80  
            
            while os.path.getsize(input_path) > target_size_kb * 1024 and quality >= 10:
                # 压缩图片并保存到临时文件
                temp_output_path = os.path.join(output_folder, f"{output_base}_temp.jpg")
                with Image.open(input_path) as img:
                    # 兼容透明通道转纯色背景
                    if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
                        img = img.convert('RGB')
                    img.save(temp_output_path, "JPEG", quality=quality)
                
                # 用临时文件替换原始文件(移至输出目录确保安全)
                final_path = os.path.join(output_folder, f"{output_base}.jpg")
                if os.path.exists(final_path):
                    os.remove(final_path)
                os.replace(temp_output_path, final_path)
                
                # 减小质量以进一步压缩
                quality -= 10
        except Exception as e:
            print(f"处理图片 {image_file} 时出错:{e}")

# 示例用法
input_folder = "input_images"
output_folder = "output_images_auto"
target_size_kb = 100  # 目标文件大小(KB)
auto_compress_images(input_folder, output_folder, target_size_kb)

关键注意事项与总结

图片压缩本质是视觉信息取舍的过程。JPEG 格式会将透明像素强制填充为背景色,处理 PNG/WebP 时需提前转换色彩模式。涉及删除、覆盖或自动改写的操作前,务必对源文件目录进行备份,防止不可逆的数据丢失。

以上就是基于Python和Pillow实现图片压缩工具的详细内容,更多关于Python图片批量处理与脚本优化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表