如何在 Exif Date 上仅设置年份

问题描述 投票:0回答:3

我只喜欢在图像上设置年份,而不更改月份、日期或时间。

如果有一个 linux bash 命令就好了。

image jpeg exif exiftool
3个回答
1
投票

根据您正在做什么,exiftool可以在没有脚本的情况下批量执行此操作。

如果您的文件的年份偏移量相同,则您可以使用时移功能向前/向后移动时间(请参阅

-TAG[+-^]=[VALUE]
选项

例如,要将年份向后移动两年,您可以使用如下命令

exiftool -AllDates-="2:0:0 0" /path/to/files/

并扭转它

exiftool -AllDates+="2:0:0 0" /path/to/files/

AllDates
是一个 exiftool 快捷方式,可编辑三个主要的 EXIF 标签:
DateTimeOriginal
DateTimeDigitized
(exiftool 称为
CreateDate
)和
DateTime
(exiftool 称为
ModifyDate
)。
2:0:0 0
代表要移动的年、月、日和小时,并且可以在小时后添加分钟和秒。对于单个数字,exiftool 默认会移动小时,因此要移动年、月或日,您必须在小时之前添加一个空格。

如果你想批量替换年份为完全不同的年份,那就会变得有点复杂。最简单的选择不是转移,而是使用

-api Filter
选项 将正则表达式应用于值,然后使用
-TagsFromFile
选项
将新值复制回文件中

例如,要将任何年份为 2026 年的文件更改为 2024 年,您可以使用如下命令

exiftool -api "Filter=s/2026/2024/" -TagsFromFile @ -AllDates /path/to/files/

这些命令创建备份文件。添加

-overwrite_original
以禁止创建备份文件。添加
-r
以递归到子目录。


0
投票

我编写了以下 python 脚本。
现在我可以运行了:

find . -iname "*.JPG" -type f -exec ./exif-set-year-only.py {} 1980 2>cp.err \;

#!/usr/bin/env python3

import sys
import os
from exif import Image, DATETIME_STR_FORMAT
from datetime import datetime

def main():
    if (len(sys.argv) - 1) != 2:
        print('usage: %s filename year' % sys.argv[0] )
        return 
    filename_in = sys.argv[1]
    new_year = int(sys.argv[2])
    path, fname = os.path.split(filename_in)
    filename_out = os.path.join(path, "modified_" + fname)
    print('reading: %s --> writing: %s' % (filename_in, filename_out))
    with open(filename_in, 'rb') as image_file:
        image = Image(image_file)
    datetime_original = datetime.strptime(image['datetime_original'], DATETIME_STR_FORMAT)
    new_datetime = datetime_original.replace(year=new_year)
    print('  changing: %s -->  %s'  % (datetime_original.strftime("%m/%d/%Y, %H:%M:%S.%f"), new_datetime.strftime("%m/%d/%Y, %H:%M:%S.%f")))
    image.datetime_original = new_datetime.strftime(DATETIME_STR_FORMAT)
    image.datetime_digitized = new_datetime.strftime(DATETIME_STR_FORMAT)
    image.datetime = new_datetime.strftime(DATETIME_STR_FORMAT)
    with open(filename_out, 'wb') as new_image_file:
        new_image_file.write(image.get_file())


if __name__ == "__main__":
    main()

0
投票

要使用自己的编程正确执行此操作,您需要解析 EXIF 流。

您需要寻找 SOI 标记,跳过任何 COM 标记,跳过任何 APPn 标记,直到找到 APP1 标记。

然后您将在 APP1 标记中的 TIF 数据中搜索日期标签。然后覆盖 8 位文本格式的日期。

所有这些都需要您通过 EXIF 和 TIF 标准。这些并不复杂(JPEG 标准很复杂)。

您的 shell 命令最终可能会损坏许多非 EXIF 格式的 JPEG 文件。

© www.soinside.com 2019 - 2024. All rights reserved.