Python-批量图片重命名与格式转换

        在日常工作和学习中,我们经常会遇到需要批量处理图片的情况,比如整理相册、统一命名规范、转换图片格式等。手动操作不仅效率低下,还容易出错。本文将介绍如何使用Python快速实现一个批量图片重命名与格式转换工具,让你的图片管理变得轻松高效!

一、功能概述

这个工具可以实现以下功能:

  1. 批量重命名:将文件夹中的所有图片按001、002、003...的顺序重新命名;

  2. 格式统一转换:将所有图片统一转换为JPG格式(可根据需要修改格式);

  3. 保持图片质量:在转换过程中保持较好的图片质量;

  4. 智能处理:自动处理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)

最后提醒:在处理重要图片前,建议先备份原始文件!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值