linuxで写真の撮影日時を修正する
海外旅行行ってきました。行ってきたのは良いのですが、カメラの日時を修正するのを忘れておりまして。 明らかに朝撮った写真なのにメタデータでは午後だったりするのがきもちわるい。というわけで、さくっと修正してみました。
修正にはexiv2というツールを使います。windows版もあるそうなので、linuxに限らず使えると思います。 また、この記事ではJPEG画像の例だけ書いていますが、DNG画像に対しても同じコマンドで使えました。他の形式のraw画像も多分平気。
とりあえず現状確認から。
$ exiv2 test.jpg
これで簡単な情報が出るのですが、簡単すぎて日時が載ってません。
詳細出力は以下のような感じで。
$ exiv2 -pt test.jpg
長いのでgrepするとこんな感じ。
$ exiv2 -pt test.jpg | grep DateTime Exif.Image.DateTime Ascii 20 2015:09:14 15:00:29 Exif.Photo.DateTimeOriginal Ascii 20 2015:09:14 15:00:29 Exif.Photo.DateTimeDigitized Ascii 20 2015:09:14 15:00:29 Exif.Image.DateTimeOriginal Ascii 20 2015:09:14 15:00:29
私のカメラではこんなんなりました。物によっては別のタグが付いたり付かなかったりする、かも。 この画像の撮影時間を7時間巻き戻してみます。
時間を足したり引いたりするのに便利な-a
オプションというのがあるので、それを使ってみます。
$ exiv2 -a -7 test.jpg $ exiv2 -pt test.jpg | grep DateTime Exif.Image.DateTime Ascii 20 2015:09:14 08:00:29 Exif.Photo.DateTimeOriginal Ascii 20 2015:09:14 08:00:29 Exif.Photo.DateTimeDigitized Ascii 20 2015:09:14 08:00:29 Exif.Image.DateTimeOriginal Ascii 20 2015:09:14 15:00:29
出来ました。…と思ったら、出来てない。
何故だか分らないのですが、Exif.Image.DateTimeOriginalは修正してくれないようです。
ちなみに、-a -6:30:10
とかやって細かく修正することも出来ます。詳しくはman pageをどうぞ。
で、やってくれないんじゃ仕方がないので、DateTimeOriginalは手動で設定します。
$ exiv2 -M 'set Exif.Image.DateTimeOriginal "2015:09:14 08:00:29"' test.jpg $ exiv2 -pt test.jpg | grep DateTime Exif.Image.DateTime Ascii 20 2015:09:14 08:00:29 Exif.Photo.DateTimeOriginal Ascii 20 2015:09:14 08:00:29 Exif.Photo.DateTimeDigitized Ascii 20 2015:09:14 08:00:29 Exif.Image.DateTimeOriginal Ascii 20 2015:09:14 08:00:29
うまくいきました。やったね。 クォートがとても不思議な囲い方をしているので注意です。
このままだとかなり面倒なので、シェルスクリプトにしてみます。
for img in `ls *.jpg`; do exiv2 -a -7 $img exiv2 -M "set Exif.Image.DateTimeOriginal '`exiv2 -g Exif.Image.DateTime $img | sed -e 's/.*20 \+//'`'" $img done
こんな感じで。
そうそう、実行する前には必ずバックアップを忘れずに。
参考: