<p>这个问题比我原来想的要复杂。在研究过程中,我查看了以下Python模块:</p>
<ul>
<li>进出口银行</li>
<li>exifread</li>
<li>皮耶西夫</li>
<li>枕头</li>
<li>pyexiv2</li>
</ul>
<p>一些模块接近于修改您想要更改的日期。但最终,我无法让任何模块正常工作。正确表示在不损坏文件的情况下更改日期字段。最后,我将推荐一种不同的方法,它使用<em>子流程</em>和一个适用于Unix和Windows的外部工具。这个工具是<a href="https://exiftool.org/" rel="nofollow noreferrer">exiftool</a>,我已经使用多年了</p>
<pre><code>import subprocess
from subprocess import check_output
from datatime import datetime
filename = 'Nikon.NEF'
rtn_data = check_output(['exiftool', filename])
print(rtn_data.decode("utf-8"))
# output
...
Create Date : 2008:10:24 09:12:12.61
...
today = datetime.today()
new_date = today.strftime("%Y:%m:%d %H:%M:%S")
subprocess.call(['exiftool', f'-CreateDate={new_date}', filename])
changed_data = check_output(['exiftool', filename])
print(changed.decode("utf-8"))
# output
...
Create Date : 2020:11:02 18:43:13
...
</code></pre>
<p>exiftool允许您一次更改任何设置和所有日期</p>
<p><strong>不使用exiftool更新:</strong></p>
<p>您可以使用<em>piexif,</em>执行此操作,但必须创建TIFF的副本并转换为JPEG。我注意到,当您创建这个副本时,一些元数据丢失了,根据您的用例,这可能是不允许的</p>
<pre><code>import piexif
from PIL import Image
from datetime import datetime
from PIL.ExifTags import TAGS
img = Image.open('test.tiff')
# get metadata
meta_dict = {TAGS[key]: img.tag[key] for key in img.tag.keys()}
exif_bytes = piexif.dump(meta_dict)
# get image height and width
height = img.height
width = img.width
# resize the image and save it to a new file, which is a JPEG
img.resize((width, height), Image.ANTIALIAS).save('test2.jpeg', "JPEG", exif=exif_bytes, quality="web_high", optimize=True)
today = datetime.today()
new_date = today.strftime("%Y:%m:%d %H:%M:%S")
# load the metadata from the original file
exif_dict = piexif.load("test.tiff")
# change various dates
exif_dict['0th'][piexif.ImageIFD.DateTime] = bytes(new_date, 'utf-8')
exif_dict['Exif'][piexif.ExifIFD.DateTimeOriginal] = bytes(new_date, 'utf-8')
exif_dict['Exif'][piexif.ExifIFD.DateTimeDigitized] = bytes(new_date, 'utf-8')
# dump the changes
exif_bytes = piexif.dump(exif_dict)
# write the changes the the JPEG file
piexif.insert(exif_bytes, 'test2.jpeg')
</code></pre>
<p>我仍然更喜欢使用exiftool,因为它需要更少的代码,并且不会丢失原始文件中的一些细节</p>