EXIFの時差修正

 海外に行っていたのだが、カメラのタイムゾーンを設定し忘れていたので、撮った写真のExifがすべて日本時間で記録されていた。ということで、ExifToolを使って、時差を補正した。

 撮影日時(DateTimeOriginal)と作成日時(CreateDate)、修正日時(ModifyDate)、それからタイムゾーンがなんか3つある(OffsetTime, OffsetTimeOriginal, OffsetTimeDigitized)ので、全部変えた。

 日本時間(+09:00)から、+02:00のタイムゾーンへの変換を行っている。

import os
import subprocess
import re
import datetime

EXIFTOOL_PATH = r"D:\Tools\exiftool\exiftool.exe"

def get_exif(filepath):
    """ ExifToolでEXIFを表示し、それを辞書として取得する"""
    cmd = f'{EXIFTOOL_PATH} "{filepath}"'
    result = subprocess.run(cmd, shell=True, check=True,
                stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    edic = dict()
    for line in result.stdout.splitlines():
        sp = line.split(":", maxsplit=1)
        key = re.sub(r"\s+$", "", sp[0])
        val = re.sub(r"^\s+", "", sp[1])
        edic[key] = val
    return edic

def modify_exif_time_zone(filepath, overwrite=0):
    """ EXIF情報を +09:00 -> +02:00に書き換える
        overwrite=1にすると、元ファイルを上書きする """
    edic = get_exif(filepath)
    old_time_zone = 9
    new_time_zone = 2
    old_time_zone_str = f"+{old_time_zone:02d}:00"
    new_time_zone_str = f"+{new_time_zone:02d}:00"

    if edic["Offset Time"] == old_time_zone_str:
        # 撮影日時を取得して、時間をずらす
        dt = datetime.datetime.strptime(edic["Date/Time Original"].split("+")[0], '%Y:%m:%d %H:%M:%S')
        offset_hours = old_time_zone - new_time_zone
        dt2 = dt - datetime.timedelta(hours=offset_hours)
        dt2_str = dt2.strftime('%Y:%m:%d %H:%M:%S')

        # 日時とタイムゾーンを書き換えるコマンド文
        cmd = f'{EXIFTOOL_PATH} -DateTimeOriginal="{dt2_str}" -CreateDate="{dt2_str}" -ModifyDate="{dt2_str}"'
        cmd += f' -OffsetTime="{new_time_zone_str}" -OffsetTimeOriginal="{new_time_zone_str}" -OffsetTimeDigitized="{new_time_zone_str}"'
        cmd += f' "{filepath}"'
        if overwrite:
            cmd += " -overwrite_original"
        
        # ExifToolを実行
        result = subprocess.run(cmd, shell=True, check=True,
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE,
                                universal_newlines=True)
        # print(result)
    return

#### ここからメイン
from glob import glob
from tqdm import tqdm

# 同フォルダにある*.JPGが対象
files = glob("*.JPG")

for filepath in tqdm(files):
    modify_exif_time_zone(filepath)

 今回はJPEGを対象としているが、ExifToolは一応RAWファイルのExifも書き換えられる。・・・が、HDR撮影したRAFファイル(FUJIFILMのRAW)は、ExifToolが対応していないのか、エラーが出て書き換えられなかった。

 また、そうでないRAFファイルはExifを書き換えることはできるが、純正現像ソフトでは現像できなくなった。非純正現像ソフトでは現像できた。