我正在使用相机套件,该套件生成的图像的日期时间保存为文件名(例如“2019-10-24-10-06-56.jpg”),而不是保存在元数据中。我正在尝试编写一个 Python 脚本,使我能够从文件名中提取日期时间,并添加到每个文件的日期时间元数据属性。这样我就可以上传到例如Google Photos 可实现正确的时间顺序索引。
据我所知,Google 相册使用“创建”日期时间属性,因此我相信这是我需要为每个 JPG 文件更改的内容。这样做的最佳方法是什么?我尝试了一些方法,包括更改 EXIF 数据(成功地使用了 piexif),但这似乎并没有改变 Windows 中显示的图像属性,而且仍然无法在 Google 相册中正确建立索引。
如果可能的话,热衷于在 Python 中执行此操作(我使用的是 Python 2.7) - 已经编写了从文件名中提取日期时间的代码。
以下代码似乎成功更改了 EXIF 数据:
from datetime import datetime
import piexif
import os
jpgFolder = r"C:\Users\srgan\Desktop\Naturewatch Camera Photos\NaturewatchCameraPhotos_24Oct19"
## count number of photos found
listOfFiles = os.listdir(jpgFolder)
fileCount = len(listOfFiles)
## create datetimeString from JPG filename
for jpg in os.listdir(jpgFolder):
filepath = jpgFolder + "\\" + jpg
year = jpg[0:4]
month = jpg[5:7]
day = jpg[8:10]
hour = jpg[11:13]
mins = jpg[14:16]
datetimeStringNew = day + "/" + month + "/" + year + " " + hour + ":" + mins
## change exif datetimestamp for "Date Taken"
exif_dict = piexif.load(filepath)
exif_dict['Exif'] = { piexif.ExifIFD.DateTimeOriginal: datetime(2019, 10, 25, 1, 1).strftime("%d:%m:%Y %H:%M") }
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, filepath)
正确返回以下内容:
{'Exif': {36867: '25:10:2019 01:01'}, '0th': {34665: 26}, 'Interop': {}, '1st': {}, 'thumbnail': None, 'GPS': {}}
但这并没有反射(reflect)在 image properties in Windows (1) 中/image properties (2)/上传到 Google 相册时日期正确。
谢谢!
快乐的地理学家 (不是经验丰富的编码员,因此对任何愚蠢的问题表示歉意)
最佳答案
首先感谢您的发帖 - 我遇到了类似的问题,您的代码给了我一些很好的提示!
我的问题是在上传后出现的,因为 Exif 中没有 GMT/UTC 标签,所以对于 google 照片,当没有 GPS 数据时,它会假设上传位置来上传数据与拍摄照片的时区(例如 GMT+11)相匹配。您可以通过 VPN 连接到该位置,也可以通过选择最近上传的照片并“编辑日期和时间”选择新的来更改上传后的所有照片位置并相对重新调整时间。
其次,我发现更新 DateTimeOriginal 和 DateTimeDigitized 似乎有帮助。
第三,我认为 Exif 数据的日期格式是 yyyy:mm:dd hh:mm:ss,所以我也在下面更新了它。
另外,我使用了日期时间字符串解析器将现有的文件日期转换为 python 日期
这是我对您的代码的看法,可能会对您有所帮助(并且也保留其余的 Exif 数据!)
from datetime import datetime
import piexif
import os
jpgFolder = r"C:\Users\srgan\Desktop\Naturewatch Camera Photos\NaturewatchCameraPhotos_24Oct19"
## count number of photos found
listOfFiles = os.listdir(jpgFolder)
fileCount = len(listOfFiles)
## create datetimeString from JPG filename
for jpg in os.listdir(jpgFolder):
filepath = jpgFolder + "\\" + jpg
parsedate=datetime.strptime(jpg[0:16], "%Y-%m-%d-%H-%M-%S")
## change exif datetimestamp for "Date Taken"
exif_dict = piexif.load(filepath)
newExifDate=parsedate.strftime("%Y:%m:%d %H:%M:%S")
exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal]=newExifDate
exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized]=newExifDate
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, filepath)
关于python - 如何使用 Python 将日期时间属性添加到 JPG 文件中,以便在 Google Photos 中正确建立索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58780073/