普通にjpgファイルのexifを読み込もうと思うと、検索して真っ先に出てくるのが以下のコード。
ちなみにやろうとしていたのは、Amazon Photosにバックアップしようとして上書きされたタイムスタンプをexifデータで戻す作業。
(気軽にタイムスタンプを書き換えるサービス、ホント良くない!)
ファイル操作のループは省略。targetfile
にフルパスで入ってると思いねェ。
PILでファイルを開いたままos.utimeで書き換えてるのは気持ち悪いと思うが、exifデータに撮影日時が入っている時だけ処理するのをフラグとか面倒なことしないで書くとこうなった。
気になる人は直して使ってちょ。
from PIL import Image
import time
import datetime
import os
with Image.open(targetfile) as im:
exifdict = im._getexif()
if 36867 in exifdict:
newtime = time.mktime(
datetime.datetime.strptime(
exifdict[36867],
'%Y:%m:%d %H:%M:%S'
).timetuple()
)
os.utime(targetfile, (newtime,newtime))
で、終わりと思いきや、いくつかの写真を読み込もうとしたところ、空の辞書が返却されてしまって困ることがあった。
で、他にexif情報にアクセスする方法を調べてみると、piexifを使う方法が紹介されていて、この場合は全ての写真のexif情報にアクセスできた。
anaconda3で入れてもこいつは入ってこないので、まずインストールから。
pip install piexif
こいつでexif情報にアクセスするとbyte stringで帰ってくるので、デコードすること。
他は同じ。
import piexif
from PIL import Image
import time
import datetime
import os
with Image.open(targetfile) as im:
exifdict = piexif.load(im.info['exif'])["Exif"]
if 36867 in exifdict:
newtime = time.mktime(
datetime.datetime.strptime(
exifdict[36867].decode(),
'%Y:%m:%d %H:%M:%S'
).timetuple()
)
os.utime(targetfile, (newtime,newtime))