【问题标题】:How to Change image captured date in python?如何在python中更改图像捕获日期?
【发布时间】:2020-11-03 05:49:56
【问题描述】:

由于相机日期设置错误,我有超过 500 张图像 (png /jpg) 的拍摄日期(拍摄日期)错误。我将照片移动到手机,手机图库根据“拍摄日期”对照片进行分类。我希望所有照片都按顺序显示。

那么如何使用 python 脚本更改捕获日期(拍摄日期)?

【问题讨论】:

标签: python image image-processing


【解决方案1】:

使用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.jpgDateTimeDateTimeOriginalDateTimeDigitized EXIF 字段。

【讨论】:

  • piexif.insert() 添加第二个 EXIF 块(如果已经存在)。更好的方法是:exif_dict = piexif.load(filename); piexif.remove(文件名); ... ; piexif.insert(exif_bytes,文件名)。谷歌相册总是读取第一个 EXIF 块,其他软件显示最后一个。最好在 JPEG 中只有一个 EXIF 块。
【解决方案2】:

不需要编写 Python,您可以在终端中使用 jhead 一行代码完成。例如,将所有 EXIF 时间向前调整 1 小时

jhead -ta+1:00 *.jpg

复制您的文件并首先对其进行测试!

here下载。

【讨论】:

  • 这是一个如何在 Python 中实现的问题。
  • @PeterWood 是的,我知道。 OP 可能认为需要一些冗长的脚本,并且可能只知道 Python,因此将其标记为这样。我只是指出一个更简单的解决方案——如果 OP 希望忽略它,欢迎他....否则他可以花 3 天时间编写 Python 并说 “如果有人提到我可以在 5 秒内完成单线”。只是想帮忙。
  • 您可以通过 cmets 中的问题来澄清这一点。我很感激你很有帮助。我也尽力提供帮助。
  • 除了我在搜索“python add date taken exif”之外,这是排名靠前的结果之一,对我完全没有帮助
  • @MarkSetchell 我正在尝试在此线程中使用您的解决方案,并且可以使用您的建议! [stackoverflow.com/questions/60514748/… (stackoverflow.com/questions/60514748/…)
【解决方案3】:

我可能会迟到,但我编写了一个 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__")

【讨论】:

    【解决方案4】:

    PNG 不支持 EXIF,所以我根据Wilbur Dsouzaanswer 来修复创建/修改时间:

    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]) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-19
      • 1970-01-01
      • 2015-06-14
      • 2016-10-09
      相关资源
      最近更新 更多