使用 Python 对图片进行等比例批量压缩

栗子
栗子
发布时间:2026-10-12 | 2人浏览过
原创

使用 Python 进行图片批量压缩时,直接修改宽高易导致画面变形。本文基于 Pillow 库提供一套自动化脚本,通过按比例缩放目标尺寸、处理 RGBA 通道转换及批量读写文件,实现无损比例压缩,适用于前端资源优化与本地照片整理。

Python 批量压缩并保持原图比例

准备条件与安装依赖

操作核心依赖第三方图像处理库 Pillow(PIL 的现代分支),结合标准库 os 完成路径遍历。建议在虚拟环境中安装以避免冲突:

pip install pillow

第1步:初始化环境与扫描文件列表

目的:建立输入输出目录映射,过滤非图片格式,防止无效路径引发运行时错误。
入口:终端命令或集成开发环境脚本顶部。
动作:调用 os.listdir() 获取源目录清单,配合后缀名匹配筛选有效图像文件。
参数:input_dir(原图路径)、target_width(期望基准宽度)。
完成状态:控制台打印出待处理图片的路径列表,无 FileNotFoundError 抛出。

第2步:按原比例计算尺寸并执行缩放

目的:在不破坏原始长宽比的前提下缩小像素总量,减小文件体积。
入口:循环遍历上一步生成的文件列表。
动作:使用 Image.open() 加载图像对象,读取 size 属性获取原始宽高。利用公式 new_height = int(original_height * target_width / original_width) 推算新高度,随后调用 resize() 重采样接口。
参数:(target_width, new_height) 元组,重采样算法建议设为 Image.Resample.LANCZOS 以兼顾清晰度与渲染速度。
完成状态:内存中的图像对象尺寸精确匹配目标宽高,边缘过渡平滑无锯齿。

第3步:色彩空间适配与定向保存

目的:解决透明底图(RGBA 模式)保存为 JPEG 等无 Alpha 通道格式时的报错问题,并将结果隔离存放。
入口:缩放逻辑执行完毕后。
动作:通过 out_im.mode 判断当前色彩空间,若为 RGBA 则调用 .convert("RGB") 剥离透明度通道。使用 os.path.join() 拼接输出路径,调用 .save() 写入磁盘。
参数:output_dir(独立子文件夹)、文件命名规则保持原名不变。
完成状态:输出文件夹内生成对应尺寸的新图片,原图未被覆盖或移动。

import os
from PIL import Image

def batch_compress_images(input_dir='pictures', output_dir='pictures_new', target_width=165):
    os.makedirs(output_dir, exist_ok=True)
    supported_ext = ('.png', '.jpg', '.jpeg', '.webp', '.bmp')
    
    for filename in os.listdir(input_dir):
        if filename.lower().endswith(supported_ext):
            src_path = os.path.join(input_dir, filename)
            dst_path = os.path.join(output_dir, filename)
            
            try:
                img = Image.open(src_path)
                orig_w, orig_h = img.size
                new_h = int(orig_h * target_width / orig_w)
                
                # 使用高质量重采样算法保持细节
                out_img = img.resize((target_width, new_h), Image.Resample.LANCZOS)
                
                # 颜色空间统一处理
                if out_img.mode == 'RGBA':
                    out_img = out_img.convert('RGB')
                    
                out_img.save(dst_path)
                print(f"已处理: {filename} ({orig_w}x{orig_h} -> {target_width}x{new_h})")
            except Exception as e:
                print(f"跳过 {filename}: {e}")

if __name__ == '__main__':
    batch_compress_images()
原始图片展示,分辨率为3392x3392
原图分辨率较高,直接加载会显著拖慢页面性能
压缩后图片展示,分辨率为165x144
按设定宽度 165px 等比例缩放后的效果,文件体积显著降低

完成判断与进阶说明

脚本运行结束后,核对输出目录的文件数量是否与源目录一致,并随机抽取图片查看是否出现黑边或横向拉伸。若预览尺寸符合业务要求且无编码异常,即代表批量压缩流程跑通。

除基础缩放外,Pillow 同样内置裁切(crop)、缩略图生成(thumbnail,会在内存中自动维持比例裁剪)、几何变换(rotate/transpose)及滤镜应用等功能。若后续需要对接更复杂的计算机视觉流水线或深度学习数据增强,可在此基础上平滑迁移至 OpenCV 框架。

以上为使用 Python 进行图片等比例批量压缩的详细内容,更多关于 Python 图像处理与自动化办公的资料请关注本站其它相关文章!

相关标签:

本站声明

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

Python 相关产品和应用

全部下载

专题列表