在日常工作和学习中,我们经常会遇到需要批量处理图片的情况,比如整理相册、统一命名规范、转换图片格式等。手动操作不仅效率低下,还容易出错。本文将介绍如何使用Python快速实现一个批量图片重命名与格式转换工具,让你的图片管理变得轻松高效!
一、功能概述
这个工具可以实现以下功能:
-
批量重命名:将文件夹中的所有图片按001、002、003...的顺序重新命名;
-
格式统一转换:将所有图片统一转换为JPG格式(可根据需要修改格式);
-
保持图片质量:在转换过程中保持较好的图片质量;
-
智能处理:自动处理RGBA等特殊模式,避免背景变黑的问题。
重命名前:

重命名后:

二、核心功能详解
1. 主函数框架
def rename_images(folder_path):
'''
重命名文件夹中的所有图片文件,从001开始编号,统一转换为jpg格式
folder_path: 包含图片的文件夹路径
'''
# 1. 定义支持的图片格式
image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
try:
# 2. 获取并筛选图片文件
# 3. 清理临时文件
# 4. 批量处理图片(转换+重命名)
# 5. 重命名临时文件为最终文件名
except Exception as e:
print(f"发生错误:{str(e)}")
import traceback
traceback.print_exc()
2. 图片文件筛选
使用列表推导式来筛选出所有支持的图片格式文件。
-
os.path.splitext()分离文件名和扩展名,为了方便地获取文件的扩展名; -
.lower()统一转换为小写,避免大小写问题; -
f.startswith('.'):跳过Mac/Linux系统的隐藏文件; -
f.startswith('temp_'):避免重复处理临时文件。
# 支持的图片格式列表
image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
# 获取文件夹中所有文件
files = os.listdir(folder_path)
# 筛选图片文件的逻辑
image_files = []
for f in files:
# 跳过隐藏文件和临时文件
if f.startswith('.'):
continue
# 获取文件扩展名(转换为小写)
file_ext = os.path.splitext(f)[1].lower()
# 检查是否为支持的图片格式
if file_ext in image_extensions:
# 跳过已经是临时文件的
if not f.startswith('temp_'):
image_files.append(f)
# 按文件名排序
image_files.sort()
3. 图片格式转换
| 模式 | 说明 | 处理方式 |
| RGBA | 红绿蓝+透明度 | 创建白色背景,使用alpha通道作为模板 |
| LA | 亮度+透明度 | 创建白色背景,转换为RGB后处理 |
| P | 调色板模式 | 先转为RGBA,再处理透明度 |
| 其他 |
CMYK等 | 直接转化为RGB模式 |
1)RGBA模式 (红绿蓝+透明度)
RGBA = Red(红) + Green(绿) + Blue(蓝) + Alpha(透明度),每个像素有4个通道值
-
R: 红色值 (0-255)
-
G: 绿色值 (0-255)
-
B: 蓝色值 (0-255)
-
A: 透明度值 (0-255),0=完全透明,255=完全不透明
2)LA模式 (亮度+透明度)
-
L: 亮度值 (0-255),0=黑色,255=白色
-
A: 透明度值 (0-255)
3)P模式 (调色板模式/索引色)
-
使用颜色调色板(通常256色)
-
每个像素存储的是调色板索引,而不是实际颜色值
-
常见于GIF格式,可以减小文件大小
4)其他模式的处理
CMYK(印刷色)= Cyan(青) + Magenta(品红) + Yellow(黄) + Key(黑色)
-
印刷行业标准,用于印刷
-
处理:直接转换为RGB(
img.convert('RGB'))
为什么要转化成RGB?
因为JPG只支持RGB模式,不支持透明度,RGB是最通用的颜色模式,还有一个原因就是简化处理,统一处理逻辑。
with Image.open(old_path) as img:
print(f" 原图格式: {img.format}, 模式: {img.mode}, 大小: {img.size}")
# 处理不同的颜色模式
if img.mode in ('RGBA', 'LA', 'P'):
print(" 处理RGBA/LA/P模式...")
# 创建白色背景
background = Image.new('RGB', img.size, (255, 255, 255)) # # 创建白色背景
# 特殊处理调色板模式
if img.mode == 'P':
img = img.convert('RGBA')
# 处理透明度
if img.mode == 'RGBA':
background.paste(img, mask=img.split()[-1]) # img.split()[-1] 获取alpha通道(最后一个通道)
else:
background.paste(img)
img = background
# 处理其他非RGB模式
elif img.mode != 'RGB':
print(f" 转换模式: {img.mode} -> RGB")
img = img.convert('RGB')
# 保存为JPG格式
img.save(temp_path, 'JPEG', quality=95, optimize=True)
# 'JPEG':必须使用'JPEG'而不是'JPG'作为保存格式
# quality=95:JPG质量设置(1-100,值越大质量越好)
# optimize=True:启用优化,减少文件大小
4. 安全的临时文件处理机制
· 防止数据丢失:先保存成功再删除原文件
· 避免文件名冲突:使用临时文件名避免覆盖
· 支持断点续传:程序中断后可重新运行
# 使用临时文件名避免冲突
temp_files = []
for i, filename in enumerate(image_files, 1):
print(f"\n正在处理第 {i} 个文件: {filename}")
# 构建新文件名
new_filename = f"{i:03d}.jpg"
old_path = os.path.join(folder_path, filename)
# 检查原文件是否存在
if not os.path.exists(old_path):
print(f"文件不存在: {filename}")
continue
# 先保存到临时位置
temp_path = os.path.join(folder_path, f"temp_{i:03d}.jpg")

5. 清理与维护功能
-
每次运行前清理旧的临时文件
-
防止临时文件积累占用磁盘空间
-
使用try-except避免清理失败影响主流程
# 清理可能存在的旧临时文件
for f in os.listdir(folder_path):
if f.startswith('temp_') and f.endswith('.jpg'):
try:
temp_path = os.path.join(folder_path, f)
os.remove(temp_path)
print(f"清理临时文件: {f}")
except:
pass
6. 基础使用方法
if __name__ == "__main__":
# 设置图片文件夹路径
folder_path = "你的文件夹图片所在的路径" # 可以是相对路径或绝对路径
# 执行处理
rename_images(folder_path)
三、完整代码
import os
from PIL import Image
def rename_images(folder_path):
'''
重命名文件夹中的所有图片文件,从001开始编号,统一转换为jpg格式
folder_path: 包含图片的文件夹路径
'''
image_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff', '.webp']
try:
# 获取文件夹中的所有文件
files = os.listdir(folder_path)
if not files:
print("文件夹为空")
return
print(f"文件夹中有 {len(files)} 个文件")
# 筛选出图片文件,并按文件名排序
image_files = []
for f in files:
# 跳过隐藏文件和临时文件
if f.startswith('.'):
continue
file_ext = os.path.splitext(f)[1].lower()
if file_ext in image_extensions:
# 获取文件完整路径
file_path = os.path.join(folder_path, f)
# 跳过已经是临时文件的
if not f.startswith('temp_'):
image_files.append(f)
# 按文件名排序
image_files.sort()
if not image_files:
print("未找到支持的图片文件")
return
print(f"找到 {len(image_files)} 个图片文件")
print("图片文件列表:", image_files)
# 清理可能存在的旧临时文件
for f in os.listdir(folder_path):
if f.startswith('temp_') and f.endswith('.jpg'):
try:
temp_path = os.path.join(folder_path, f)
os.remove(temp_path)
print(f"清理临时文件: {f}")
except:
pass
# 使用临时文件名避免冲突
temp_files = []
for i, filename in enumerate(image_files, 1):
print(f"\n正在处理第 {i} 个文件: {filename}")
# 构建新文件名
new_filename = f"{i:03d}.jpg"
old_path = os.path.join(folder_path, filename)
# 检查原文件是否存在
if not os.path.exists(old_path):
print(f"文件不存在: {filename}")
continue
# 先保存到临时位置
temp_path = os.path.join(folder_path, f"temp_{i:03d}.jpg")
try:
# 打开并处理图片
with Image.open(old_path) as img:
print(f" 原图格式: {img.format}, 模式: {img.mode}, 大小: {img.size}")
# 转换为RGB模式
if img.mode in ('RGBA', 'LA', 'P'):
print(" 处理RGBA/LA/P模式...")
background = Image.new('RGB', img.size, (255, 255, 255))
if img.mode == 'P':
img = img.convert('RGBA')
if img.mode == 'RGBA':
background.paste(img, mask=img.split()[-1])
else:
background.paste(img)
img = background
elif img.mode != 'RGB':
print(f" 转换模式: {img.mode} -> RGB")
img = img.convert('RGB')
# 修复:使用 'JPEG' 而不是 'JPG'
img.save(temp_path, 'JPEG', quality=95, optimize=True)
print(f" 已保存临时文件: temp_{i:03d}.jpg")
# 删除原文件
os.remove(old_path)
temp_files.append((temp_path, new_filename))
print(f" 完成: {filename} -> {new_filename}")
except Exception as e:
print(f" 处理失败 {filename}: {str(e)}")
import traceback
traceback.print_exc()
continue
if not temp_files:
print("\n没有成功处理任何文件")
return
# 第二步:将临时文件重命名为最终文件名
print("\n开始重命名临时文件...")
for temp_path, new_filename in temp_files:
new_path = os.path.join(folder_path, new_filename)
try:
if os.path.exists(temp_path):
os.rename(temp_path, new_path)
print(f"重命名: {os.path.basename(temp_path)} -> {new_filename}")
else:
print(f"临时文件不存在 {temp_path}")
except Exception as e:
print(f"重命名失败 {temp_path}: {e}")
print(f"\n完成!共成功处理了 {len(temp_files)} 个图片文件。")
except Exception as e:
print(f"发生错误:{str(e)}")
import traceback
traceback.print_exc()
# 使用示例
if __name__ == "__main__":
# 替换为你的文件夹路径
folder_path = "图片" # 相对路径或绝对路径
# 执行重命名和转换
rename_images(folder_path)
最后提醒:在处理重要图片前,建议先备份原始文件!
836

被折叠的 条评论
为什么被折叠?



