更新2022.09.09
代码已经大幅更新,需要的同学可以去这篇文章自取。
需求
- 一些照片没有拍摄日期,传到手机就会显示在上传的这一天,导致时间线错乱。根据文件名中包含的日期,在Exif中插入拍摄日期,这样在手机里就可以按照时间线排列了。
- 反之,也可以根据拍摄日期,重置照片文件名。如果两张照片的拍摄时间完全一样,就在文件名后累加数字 123… 区分:
IMG_20210722_070707_1.jpg
IMG_20210722_070707_2.jpg
运行结果展示
代码
代码已经大幅更新,需要的同学可以去文章开头自取。
# Change photo name by photo date/time and vice versa.
# 功能:
# 1. 根据照片名称修改照片日期:根据照片名中包含的日期信息,修改照片Exif中的日期信息
# 2. 根据照片日期修改照片名称:根据照片Exif中的日期信息,按照统一格式重命名照片
import os, time, piexif, re
import re
from PIL import Image
# ------------------------------------------------------------------
## general functions
# ------------------------------------------------------------------
def check_format(photo_path):
'''
检查文件类型是否为图片格式,返回文件后缀类型,大写字母
'''
def check_exif(photo_path):
'''
检查文件是否有Exif,Exif中是否有拍摄时间
'''
def png2jpg(photo_path):
'''
png2jpg
ps. 直接改文件后缀名,后续跑不通,piexif不认这个JPG,原因不详
'''
# ------------------------------------------------------------------
## change photo name based on photo time
# ------------------------------------------------------------------
def change_photo_name(folder):
'''
修改JPG照片的文件名为拍摄日期,如果Exif中不包含拍摄日期,修改文件名为照片修改日期
e.g., IMG_20210424_071829.jpg
'''
def get_time_from_exif(photo_path):
'''
从Exif中提取照片时间,返回格式为2021:04:22 07:07:07
'''
def get_time_from_create_date(photo_path):
'''
从照片修改日期提取时间,返回格式为2021:04:22 07:07:07
'''
def get_new_name(photo_path, photo_time):
'''
获取照片新文件名,如果两张照片时分秒也相同,在文件名后累加数字1 2 3...区分
e.g., IMG_20210422_070707_X.jpg
'''
# ------------------------------------------------------------------
## change photo time based on photo name
# ------------------------------------------------------------------
def change_photo_time(folder):
'''
修改该路径下的所有JPG照片的时间
'''
def get_time_from_name(photo_name):
'''
利用正则表达式从文件名中提取时间,再转换为Exif时间格式
from 'IMG_20220102_030405.jpg' to '2022:01:01 03:04:05'
'''
def set_photo_time(photo_name, photo_path):
'''
给照片设置拍摄时间,导入exif信息
'''
# ------------------------------------------------------------------
## main
# ------------------------------------------------------------------
if __name__ == '__main__':
'''
folder: 需要修改的照片文件夹路径
'''
folder = r'D:\4 照片\新建文件夹\新建文件夹' # 此处改为需要修改的照片文件夹路径
no_exif, exif_load_error, no_time_in_name = [[] for i in range(3)]
motion = input('Change name or time: ') # 输入需要修改照片name还是time
while motion not in ['name', 'time']:
motion = input('Please just input name or time: ')
if motion == 'name':
change_photo_name(folder)
else: # motion == 'time'
change_photo_time(folder)
# 统计不能执行的照片文件
if no_exif:
print('Photos_no_exif:\n', no_exif)
if exif_load_error:
print('Photos_exif_load_error:\n', exif_load_error)
if no_time_in_name:
print('Photos_no_time_in_name:\n', no_time_in_name)