python - 如何使用 Python 将日期时间属性添加到 JPG 文件中,以便在 Google Photos 中正确建立索引?

标签 python python-2.7 jpeg exif google-photos

我正在使用相机套件,该套件生成的图像的日期时间保存为文件名(例如“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/

相关文章:

python - 为什么打印内部类打印出来就好像它是一个模块的变量?

excel - 如何使用 VBA 修改 JPG 文件中的元数据

python - 使用 Python 将 PDF 转换为一系列图像

python - 通过装饰器注入(inject)类属性

python - Pandas ,重命名多索引列(数据顺序已更改)

python - 为什么 python 文档字符串的解释与注释不同

Python路径解释: import from a subpackage

python - Virtualenv 找不到新安装的 Python 版本

python - 不允许主机连接到此 MySQL 服务器(从 VM)

bitmap - 是否可以将 JPG 制成的 BMP 重新编码回 JPG 而不会降低质量?