【发布时间】:2020-11-03 05:49:56
【问题描述】:
由于相机日期设置错误,我有超过 500 张图像 (png /jpg) 的拍摄日期(拍摄日期)错误。我将照片移动到手机,手机图库根据“拍摄日期”对照片进行分类。我希望所有照片都按顺序显示。
那么如何使用 python 脚本更改捕获日期(拍摄日期)?
【问题讨论】:
标签: python image image-processing
由于相机日期设置错误,我有超过 500 张图像 (png /jpg) 的拍摄日期(拍摄日期)错误。我将照片移动到手机,手机图库根据“拍摄日期”对照片进行分类。我希望所有照片都按顺序显示。
那么如何使用 python 脚本更改捕获日期(拍摄日期)?
【问题讨论】:
标签: python image image-processing
使用piexif 库很容易做到这一点:
from datetime import datetime
import piexif
filename = 'image.jpg'
exif_dict = piexif.load(filename)
new_date = datetime(2018, 1, 1, 0, 0, 0).strftime("%Y:%m:%d %H:%M:%S")
exif_dict['0th'][piexif.ImageIFD.DateTime] = new_date
exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = new_date
exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = new_date
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, filename)
此脚本会将新日期2018:01:01 00:00:00 插入image.jpg 的DateTime、DateTimeOriginal 和DateTimeDigitized EXIF 字段。
【讨论】:
不需要编写 Python,您可以在终端中使用 jhead 一行代码完成。例如,将所有 EXIF 时间向前调整 1 小时
jhead -ta+1:00 *.jpg
复制您的文件并首先对其进行测试!
从here下载。
【讨论】:
我可能会迟到,但我编写了一个 python 脚本,用于根据文件名格式批量更改 whatsapp 照片的拍摄时间字段,例如:IMG-20160117-WA0001.jpg。 这也不会覆盖现有属性。 https://github.com/dsouzawilbur/Scripts/blob/master/Change_Photo_Taken_Time.py
import os
import re
import piexif
def absoluteFilePaths(directory):
for dirpath,_,filenames in os.walk(directory):
for f in filenames:
fullPath = os.path.abspath(os.path.join(dirpath, f))
if re.match(r"^IMG-\d\d\d\d\d\d\d\d-WA\d\d\d\d.*", f) and not re.match(r"^IMG-\d\d\d\d\d\d\d\d-WA\d\d\d\d-ANIMATION.gif", f):
print(f+" Matched")
match = re.search("^IMG-(\d\d\d\d)(\d\d)(\d\d)-WA\d\d\d\d.*", f)
year = match.group(1)
month= match.group(2)
day = match.group(3)
exif_dict = piexif.load(fullPath)
#Update DateTimeOriginal
exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = datetime(int(year), int(month), int(day), 4, 0, 0).strftime("%Y:%m:%d %H:%M:%S")
#Update DateTimeDigitized
exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = datetime(int(year), int(month), int(day), 4, 0, 0).strftime("%Y:%m:%d %H:%M:%S")
#Update DateTime
exif_dict['0th'][piexif.ImageIFD.DateTime] = datetime(int(year), int(month), int(day), 4, 0, 0).strftime("%Y:%m:%d %H:%M:%S")
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, fullPath)
print("############################")
absoluteFilePaths("__DIRECTORY_WITH_PHOTOS__")
【讨论】:
PNG 不支持 EXIF,所以我根据Wilbur Dsouza 的answer 来修复创建/修改时间:
import datetime
import os
import re
import sys
import time
import piexif
def fix(directory):
print(directory)
for dirpath, _, filenames in os.walk(directory):
for f in filenames:
fullPath = os.path.abspath(os.path.join(dirpath, f))
# Format: Screenshot_20170204-200801.png
if re.match(r"^Screenshot_\d\d\d\d\d\d\d\d-\d\d\d\d\d\d.*", f):
match = re.search("^Screenshot_(\d\d\d\d)(\d\d)(\d\d)-(\d\d)(\d\d)(\d\d).*", f)
year = int(match.group(1))
month = int(match.group(2))
day = int(match.group(3))
hour = int(match.group(4))
minute = int(match.group(5))
second = int(match.group(6))
date = datetime.datetime(year=year, month=month, day=day, hour=hour, minute=minute, second=second)
modTime = time.mktime(date.timetuple())
print(f, date)
os.utime(fullPath, (modTime, modTime))
if __name__ == "__main__":
fix(sys.argv[1])
【讨论】: