import os
import argparse
from datetime import datetime
from PIL import Image, ExifTags
from PIL.PngImagePlugin import PngInfo
def modify_jpeg_datetime(image_path, new_datetime):
"""修改 JPEG 图片的拍摄时间"""
try:
with Image.open(image_path) as img:
# 获取 EXIF 数据
exif_data = img._getexif()
if exif_data is None:
exif_data = {}
# 将字典键从数值转换为字符串标签
exif = {ExifTags.TAGS[k]: v for k, v in exif_data.items() if k in ExifTags.TAGS}
# 设置拍摄时间
datetime_str = new_datetime.strftime("%Y:%m:%d %H:%M:%S")
exif['DateTimeOriginal'] = datetime_str
exif['DateTimeDigitized'] = datetime_str
# 创建新的 EXIF 数据
exif_bytes = img.getexif()
for tag, value in exif.items():
if tag in ExifTags.TAGS:
tag_id = list(ExifTags.TAGS.keys())[list(ExifTags.TAGS.values()).index(tag)]
exif_bytes[tag_id] = value
# 保存修改后的图片
img.save(image_path, exif=exif_bytes)
print(f"成功修改 JPEG 图片 {image_path} 的拍摄时间为 {datetime_str}")
except Exception as e:
print(f"修改 JPEG 图片失败: {e}")
def modify_png_datetime(image_path, new_datetime):
"""修改 PNG 图片的元数据时间"""
try:
datetime_str = new_datetime.strftime("%Y-%m-%d %H:%M:%S")
# 修改文件的创建时间和修改时间
timestamp = new_datetime.timestamp()
os.utime(image_path, (timestamp, timestamp))
# 尝试修改 PNG 的元数据(如果支持)
try:
with Image.open(image_path) as img:
metadata = PngInfo()
metadata.add_text("Creation Time", datetime_str)
img.save(image_path, pnginfo=metadata)
except:
# 如果无法修改元数据,只修改文件系统时间
pass
print(f"成功修改 PNG 图片 {image_path} 的时间为 {datetime_str}")
except Exception as e:
print(f"修改 PNG 图片失败: {e}")
def main():
parser = argparse.ArgumentParser(description='修改图片的拍摄时间')
parser.add_argument('image_path', help='图片文件路径')
parser.add_argument('datetime', help='新的拍摄时间,格式: YYYY-MM-DD HH:MM:SS')
args = parser.parse_args()
try:
# 解析日期时间
new_datetime = datetime.strptime(args.datetime, "%Y-%m-%d %H:%M:%S")
# 检查文件是否存在
if not os.path.exists(args.image_path):
print(f"错误: 文件 {args.image_path} 不存在")
return
# 获取文件扩展名并转换为小写
file_ext = os.path.splitext(args.image_path)[1].lower()
# 根据文件类型调用相应的处理函数
if file_ext == '.jpg' or file_ext == '.jpeg':
modify_jpeg_datetime(args.image_path, new_datetime)
elif file_ext == '.png':
modify_png_datetime(args.image_path, new_datetime)
else:
print(f"错误: 不支持的文件类型 {file_ext},仅支持 JPG、JPEG 和 PNG")
except ValueError as e:
print(f"日期时间格式错误: {e},请使用 YYYY-MM-DD HH:MM:SS 格式")
except Exception as e:
print(f"发生未知错误: {e}")
if __name__ == "__main__":
main()