批量处理图像需用pathlib递归扫描常见格式文件,配合PIL安全缩放并保存至独立输出目录,加try-except防中断、tqdm显进度、multiprocessing提效,确保源数据不被覆盖。

批量处理图像文件在Python项目中很常见,比如统一调整尺寸、批量转格式、加水印或提取特征。核心是用好os、glob或pathlib遍历文件,再配合PIL(Pillow)或OpenCV做具体操作。关键不是写死单个路径,而是构建可复用的路径扫描+任务执行流程。
准备环境与基础依赖
确保已安装必要库:
-
pip install pillow(推荐用于常规图像读写、缩放、格式转换) - 如需处理视频帧或高级计算机视觉任务,再加
pip install opencv-python - 用
pathlib更现代简洁(Python 3.4+ 内置,无需额外安装)
安全地批量读取指定类型图像文件
别用os.listdir()硬过滤,容易漏掉子目录或误读隐藏文件。推荐用pathlib.Path递归匹配:
from pathlib import Pathimg_dir = Path("input_images")
立即学习“Python免费学习笔记(深入)”;
支持通配符,自动忽略大小写(如 .JPG 和 .jpg 都命中)
image_paths = list(img_dir.rglob(".[jJ][pP][gG]")) + \ list(img_dir.rglob(".[pP][nN][gG]")) + \ list(img_dir.rglob("*.[tT][iI][fF]"))
或更简洁地用 casefold 处理后缀
image_paths = [p for p in img_dir.rglob(".") if p.suffix.casefold() in {".jpg", ".jpeg", ".png", ".tiff", ".bmp"}]
这样能覆盖常见格式,也便于后续扩展。
逐个处理并保存到新目录(不覆盖原图)
批量操作务必避免覆盖原始数据。建议按“输入→处理→输出”分离路径,并自动创建目标文件夹:
from PIL import Imageoutput_dir = Path("resized_images") output_dir.mkdir(exist_ok=True) # 确保输出目录存在
for img_path in image_paths: try: with Image.open(img_path) as im:
示例:等比缩放到最大边为800像素
im.thumbnail((800, 800), Image.Resampling.LANCZOS) # 保存时保持原格式,输出名不变,仅改路径 save_path = output_dir / img_path.name # PNG保留透明通道,JPG转RGB避免报错 if save_path.suffix.lower() == ".png": im.save(save_path) else: if im.mode in ("RGBA", "LA", "P"): im = im.convert("RGB") im.save(save_path, quality=95) except Exception as e: print(f"跳过 {img_path.name}:{e}")加
try...except防止某张图损坏导致整个流程中断。进阶技巧:加进度提示与并行加速
处理几百张以上图片时,加进度条提升体验;CPU密集型任务(如滤镜、重采样)可用
multiprocessing提速:
- 用
tqdm显示进度:pip install tqdm,然后在循环前加for img_path in tqdm(image_paths, desc="处理中"): - 并行处理示例(适合多核CPU):
from multiprocessing import Pool,把单图处理逻辑封装成函数,再用pool.map(process_one_image, image_paths) - 注意:PIL图像对象不能直接跨进程传递,建议只传文件路径,每个子进程自己打开和保存
基本上就这些。核心是路径管理清晰、错误有兜底、输出不污染源数据。实际项目中再根据需求叠加旋转、裁剪、批量重命名或写入EXIF等操作即可。










