批量修改照片拍摄日期的脚本

wen 实用脚本 4

本文目录导读:

批量修改照片拍摄日期的脚本

  1. 方案一:使用 Python + Pillow(最常用)
  2. 方案二:使用 exiftool(最专业)
  3. 方案三:命令行版本(带参数)
  4. 使用说明
  5. 注意事项

我来帮你创建一个批量修改照片拍摄日期的脚本,这里提供几种常用的方案:

使用 Python + Pillow(最常用)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
批量修改照片拍摄日期脚本
支持格式:JPEG, PNG, TIFF 等
"""
import os
import sys
from datetime import datetime
from PIL import Image
from PIL.ExifTags import TAGS
import shutil
def get_exif_date(img):
    """获取照片的拍摄日期"""
    try:
        exif = img._getexif()
        if exif:
            for tag_id, value in exif.items():
                tag = TAGS.get(tag_id, tag_id)
                if tag == "DateTimeOriginal":
                    return value
                elif tag == "DateTimeDigitized":
                    return value
    except:
        pass
    return None
def modify_exif_date(file_path, new_date, output_dir=None):
    """
    修改照片拍摄日期
    参数:
    file_path: 照片路径
    new_date: 新的日期时间(datetime对象)
    output_dir: 输出目录(None则覆盖原文件)
    """
    try:
        # 打开图片
        img = Image.open(file_path)
        # 获取exif数据
        if hasattr(img, '_getexif'):
            exif_data = img._getexif()
        else:
            exif_data = {}
        # 如果没有exif,创建新的
        if not exif_data:
            exif_data = {}
        # 转换日期格式
        date_str = new_date.strftime("%Y:%m:%d %H:%M:%S")
        # 更新相关EXIF标签
        # DateTimeOriginal - 拍摄时间
        # DateTimeDigitized - 数字化时间
        # DateTime - 修改时间
        exif_data[36867] = date_str  # DateTimeOriginal
        exif_data[36868] = date_str  # DateTimeDigitized
        exif_data[306] = date_str    # DateTime
        # 保存修改后的exif
        if output_dir:
            os.makedirs(output_dir, exist_ok=True)
            output_path = os.path.join(output_dir, os.path.basename(file_path))
        else:
            output_path = file_path
        # 保存图片
        img.save(output_path, exif=exif_data)
        img.close()
        print(f"✅ 已修改: {os.path.basename(file_path)}")
        return True
    except Exception as e:
        print(f"❌ 修改失败 {os.path.basename(file_path)}: {str(e)}")
        return False
def process_folder(input_folder, new_date, output_folder=None, extensions=None):
    """
    批量处理文件夹中的照片
    参数:
    input_folder: 输入文件夹路径
    new_date: 新的拍摄日期
    output_folder: 输出文件夹(可选)
    extensions: 允许多文件扩展名列表
    """
    if extensions is None:
        extensions = ['.jpg', '.jpeg', '.png', '.tiff', '.bmp']
    # 转换为小写比较
    extensions = [ext.lower() for ext in extensions]
    # 获取所有图片文件
    files = []
    for file in os.listdir(input_folder):
        file_ext = os.path.splitext(file)[1].lower()
        if file_ext in extensions:
            files.append(file)
    if not files:
        print("❌ 未找到支持的图片文件")
        return
    print(f"找到 {len(files)} 张图片")
    success_count = 0
    fail_count = 0
    for file in files:
        file_path = os.path.join(input_folder, file)
        if modify_exif_date(file_path, new_date, output_folder):
            success_count += 1
        else:
            fail_count += 1
    print(f"\n📊 统计结果:")
    print(f"  成功: {success_count} 张")
    print(f"  失败: {fail_count} 张")
def main():
    """主函数 - 交互式界面"""
    print("="*50)
    print("📷 批量修改照片拍摄日期工具")
    print("="*50)
    # 输入文件夹路径
    input_folder = input("请输入图片文件夹路径: ").strip()
    # 检查文件夹是否存在
    if not os.path.exists(input_folder):
        print(f"❌ 文件夹不存在: {input_folder}")
        return
    # 输入新的日期
    date_input = input("请输入新的拍摄日期 (格式: YYYY-MM-DD HH:MM:SS): ").strip()
    try:
        new_date = datetime.strptime(date_input, "%Y-%m-%d %H:%M:%S")
    except ValueError:
        print("❌ 日期格式错误,请使用 YYYY-MM-DD HH:MM:SS 格式")
        return
    # 是否备份
    backup = input("是否备份原文件?(y/n): ").strip().lower()
    output_folder = None
    if backup == 'y':
        output_folder = os.path.join(input_folder, "modified_" + datetime.now().strftime("%Y%m%d_%H%M%S"))
        print(f"备份目录: {output_folder}")
    # 执行批量修改
    process_folder(input_folder, new_date, output_folder)
    print("\n✨ 操作完成!")
if __name__ == "__main__":
    main()

使用 exiftool(最专业)

如果你的系统安装了 exiftool,可以使用更专业的方案:

#!/bin/bash
# 批量修改照片日期 - exiftool 版本
# 使用方法:修改以下变量
PHOTO_DIR="/path/to/your/photos"  # 图片文件夹路径
NEW_DATE="2024:01:01 12:00:00"   # 新的日期时间
# 批量修改所有 JPG 文件
find "$PHOTO_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) -exec exiftool -DateTimeOriginal="$NEW_DATE" -DateTimeDigitized="$NEW_DATE" -DateTime="$NEW_DATE" {} \;

命令行版本(带参数)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
命令行版本:批量修改照片拍摄日期
用法: python modify_date.py <文件夹路径> "2024-01-01 12:00:00"
"""
import sys
import os
from datetime import datetime
def modify_photo_date(file_path, new_date_str):
    """修改单张照片的日期"""
    from PIL import Image
    from PIL.ExifTags import TAGS
    try:
        # 解析日期
        new_date = datetime.strptime(new_date_str, "%Y-%m-%d %H:%M:%S")
        date_str = new_date.strftime("%Y:%m:%d %H:%M:%S")
        # 打开并修改
        img = Image.open(file_path)
        exif_data = img._getexif() if hasattr(img, '_getexif') else {}
        # 添加或修改EXIF日期标签
        exif_data[36867] = date_str  # DateTimeOriginal
        exif_data[36868] = date_str  # DateTimeDigitized
        exif_data[306] = date_str    # DateTime
        # 保存
        img.save(file_path, exif=exif_data)
        img.close()
        print(f"✅ {os.path.basename(file_path)} -> {new_date_str}")
        return True
    except Exception as e:
        print(f"❌ {os.path.basename(file_path)}: {str(e)}")
        return False
def main():
    if len(sys.argv) != 3:
        print("用法: python modify_date.py <文件夹路径> 'YYYY-MM-DD HH:MM:SS'")
        sys.exit(1)
    folder_path = sys.argv[1]
    new_date_str = sys.argv[2]
    # 验证日期格式
    try:
        datetime.strptime(new_date_str, "%Y-%m-%d %H:%M:%S")
    except ValueError:
        print("❌ 日期格式错误,请使用 YYYY-MM-DD HH:MM:SS 格式")
        sys.exit(1)
    # 支持的扩展名
    extensions = ['.jpg', '.jpeg', '.png', '.tiff', '.bmp']
    # 处理所有图片
    count = 0
    for file in os.listdir(folder_path):
        if os.path.splitext(file)[1].lower() in extensions:
            if modify_photo_date(os.path.join(folder_path, file), new_date_str):
                count += 1
    print(f"\n✨ 成功修改 {count} 张照片")
if __name__ == "__main__":
    main()

使用说明

安装依赖

pip install Pillow

交互式使用

python modify_photos.py

命令行使用

python modify_date.py /path/to/photos "2024-01-01 12:00:00"

如果需要 exiftool

# Ubuntu/Debian
sudo apt-get install exiftool
# macOS
brew install exiftool

注意事项

  1. 备份文件:脚本默认会直接修改原文件,建议先用副本测试
  2. EXIF 信息:部分相机形成的图片可能包含多个日期字段
  3. 文件权限:确保脚本有足够的文件读写权限
  4. 批量处理:建议先测试少量文件,确认效果后再批量处理

需要我帮你调整脚本功能吗?

  • 添加日期偏移(批量加上/减去天数)
  • 根据文件名解析日期
  • 支持更多图片格式
  • 添加 GUI 界面

抱歉,评论功能暂时关闭!