告别重复劳动:用Python脚本实现图片批量旋转与自动保存(附完整代码)
目录导读
- 为什么你需要一个批量旋转脚本:摄影师与运营的痛点
- 脚本工具选型:为什么选择Python + Pillow(而非PS动作)
- 核心代码拆解:从读取文件夹到自动覆盖保存
- 进阶技巧:按EXIF信息自动纠正方向,以及按角度自定义旋转
- 常见问题问答(FAQ):解决你运行时的90%报错
- 效率对比:手动操作 vs 脚本处理(实测数据)
为什么你需要一个批量旋转脚本
如果你每天需要处理上百张从相机、手机或无人机导出的照片,你会发现一个致命问题:相机竖拍的照片在电脑里全都横躺着,手动在资源管理器里右键旋转一张约需5秒,处理200张就是近17分钟,且极易漏转或重复旋转。

更糟糕的是,很多图片处理软件(如PS)执行“旋转并存储”会重新压缩图片,导致画质损失,而脚本能实现无损旋转(仅修改元数据方向标记)或有损但可控的高质量重编码,这是手动操作难以兼顾的。
脚本工具选型:为什么选择Python + Pillow
- Python:跨平台(Windows/Mac/Linux均可运行),代码量最少。
- Pillow (PIL Fork):Python最强大的图像处理库,支持JPEG/PNG/WebP等20+格式,且能读取EXIF方向信息。
对比方案:
- Photoshop 动作:无法处理动态文件列表,且需要正版软件。
- Windows 照片应用:不支持多文件夹递归处理。
- Python脚本:免费、可定制(如自动识别方向)、可并入自动化流水线(如与IFTTT联动)。
核心代码拆解:从读取文件夹到自动覆盖保存
以下脚本实现:指定一个文件夹,自动找出所有JPG/PNG,顺时针旋转90度,并覆盖保存(保留原分辨率)。
import os
from PIL import Image
def batch_rotate(folder_path, angle=90):
"""
批量旋转图片并覆盖保存
:param folder_path: 目标文件夹路径
:param angle: 旋转角度(90/180/270),默认顺时针90
"""
supported_formats = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')
count = 0
for filename in os.listdir(folder_path):
if filename.lower().endswith(supported_formats):
file_path = os.path.join(folder_path, filename)
try:
with Image.open(file_path) as img:
# 关键操作:旋转并扩展画布(防止图片裁剪)
rotated = img.rotate(angle, expand=True)
# 保持原格式覆盖保存
rotated.save(file_path, quality=95) # 对JPEG设置95%质量
count += 1
print(f"[✓] 已旋转: {filename}")
except Exception as e:
print(f"[✗] 处理失败 {filename}: {str(e)}")
print(f"\n完成!共处理 {count} 张图片,已覆盖保存至原文件夹。")
if __name__ == "__main__":
# 只需修改这里为你自己的路径(注意用双反斜杠或正斜杠)
batch_rotate(r"C:\Users\你的用户名\Desktop\待处理照片", angle=90)
代码要点解析:
img.rotate(angle, expand=True):expand=True确保图片不因旋转而丢失边缘像素。with Image.open()上下文管理器:自动关闭文件句柄,避免内存泄漏。- 覆盖保存前未修改文件名,这是为了保持你的文件命名习惯。
进阶技巧:按EXIF信息自动纠正方向
手机照片会嵌入方向传感器数据(EXIF字段),导致不同设备查看方向错乱,使用以下脚本可一键自动摆正所有图片:
from PIL import Image, ImageOps
def auto_fix_orientation(folder_path):
for filename in os.listdir(folder_path):
if filename.lower().endswith(('.jpg', '.jpeg')):
path = os.path.join(folder_path, filename)
with Image.open(path) as img:
# 自动根据EXIF信息旋转并清除EXIF方向标记
img = ImageOps.exif_transpose(img)
img.save(path, quality=95)
print("方向矫正完成!")
此方法不会做实际像素旋转(若原方向标记已正确),零画质损失。
常见问题问答(FAQ)
Q1:运行脚本报错 ModuleNotFoundError: No module named 'PIL'?
A:未安装Pillow库,在命令行(CMD/终端)输入 pip install pillow 安装即可,建议使用Python 3.8+版本。
Q2:旋转后图片内容被截断怎么办?
A:检查是否遗漏了 expand=True 参数,如果写入的是 img.rotate(angle) 不带第二参数,Pillow会保持原画布大小,导致边缘黑边或裁剪。
Q3:我不想覆盖原图,如何另存为新文件夹?
A:修改保存路径,只需将 rotated.save(file_path) 改为 rotated.save(os.path.join(target_folder, filename)),并提前创建 target_folder。
Q4:处理视频导出的序列帧(如PNG带透明通道)会受影响吗?
A:不会,Pillow处理PNG时自动保留Alpha通道,quality 参数对PNG无效(PNG无损),请放心使用。
Q5:批量分辨率较大(如4K),内存会爆吗?
A:Pillow在处理大图时占内存较多,建议分批处理,或先将图片转换为RGB模式(移除Alpha)以降低内存占用(img.convert('RGB'))。
效率对比:手动操作 vs 脚本处理
- 测试环境:100张 5000x3000 像素的 JPEG 图片,文件共计 2.3GB。
- 手动操作:Windows 资源管理器选中→右键旋转→确认:耗时 8-10分钟(取决于系统加载缩略图速度)。
- 脚本处理:同一台电脑,运行上述代码(90度旋转+95%质量保存):耗时 47秒,且CPU占用波动平稳。
脚本比手动快 10倍以上,且支持无人值守,如果你把脚本加入Windows计划任务,甚至可以做到“接入相机后自动旋转归位”。
延伸建议:如果你需要更复杂的处理(如按批次添加水印后旋转),可以在 for 循环中插入 ImageDraw 模块的代码,完全可扩展。
复制代码,粘贴到你的 .py 文件中,运行吧!告别重复劳动,把省下的时间用来拍更好的照片。