写真の撮影時間をファイルのタイムスタンプに反映

  • 投稿日:
  • 更新日:2016/07/20
  • by
  • カテゴリ:

最近撮影した写真をMacを使ってNASに送っていて異変に気付きました。

写真ファイルのタイムスタンプが狂うのです。

もともと、カメラで撮影した写真のタイムスタンプは撮影時間だったのですが、NASにファイルをコピーした段階でどういうわけかタイムスタンプが変わってしまいます。

この症状が出るのはMacのみで、Windowsからは正常にコピーされています。

いずれにしても、気づいたのは元のカメラ内のファイルを消した後なので、Windowsを使ってコピーし直す、というわけにはいきません。

そこで、根本的な対処として、写真に含まれているEXIFタグの撮影時間をファイルのタイムスタンプに反映させるスクリプトを組みました。

clock.jpgSource: Pixabay

Exifの撮影時間をファイルのタイムスタンプに反映するスクリプト

スクリプトは以下のようになります。Perlで組みました。

ダウンロードはこちら。
exifdateのダウンロード

#!/usr/bin/perl

use Image::ExifTool;
use Time::Local 'timelocal';
my $exifTool = new Image::ExifTool;

if (@ARGV == 0) {
    print "usage: $0 <file(s)>\n";
    exit();
}

foreach $file (@ARGV) {
    if ($exifTool->ExtractInfo($file)) {
	my @filestat = stat $file;
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime($filestat[9]);
	my $orig = sprintf("%04d:%02d:%02d %02d:%02d:%02d", $year + 1900, $mon + 1, $mday, $hour, $min, $sec);
	my $cdate = $exifTool->GetValue('CreateDate');
	if ($cdate ne "") {
	    if ($cdate eq $orig) {
		print "$file, [$orig], unchanged.\n";
	    } else {
		($year, $mon, $mday, $hour, $min, $sec) = split /:|\s/, $cdate;
		my $time = timelocal($sec, $min, $hour, $mday, $mon - 1, $year - 1900);
		print "$file, [$orig] to [$cdate].\n";
		utime $time, $time, $file;
	    }
	} else {
	    print $file, " has no exif time.\n";
	}
    } else {
	print $file, " cannot be handled.\n";
    }
}

使い方

このスクリプトを動かすためには、実行マシンにperlが入っている必要があります。また、perlのライブラリとしてImage::ExifToolを使っていますので、入っていない場合は以下のようにして入れてください。

$ cpan Image::ExifTool

cpanが入っていない場合は...入れてください。WindowsかMacかLinuxかで環境はいろいろですが、「cpan インストール」でググればいろいろ出てくると思います。

上記のスクリプトを"exifdate"という名前で保存していたとすると、

$ chmod a+x exifdate

としておきます。

実行は、本ツールがカレンドディレクトリにあるとすると、

$ ./exifdate <ファイル名>

です。ファイル名はワイルドカード指定が可能です。

実行すると、以下のように結果を表示します。

$ ./exifdate *
DSC_0100.jpg, [2016:06:30 10:04:32] to [2016:06:08 12:22:34].
DSC_0101.jpg, [2016:06:08 12:22:38], unchanged.
index.html has no exif time.
images cannot be handled.

上記の実行結果のうち、DSC_0100.jpgは時刻変更に成功したこと、DSC_0101.jpgはもともとファイルスタンプとEXIFの情報が同じで時刻の変更の必要がないことを表します。

index.htmlはexif情報を持たない(当たり前ですが)ので、処理がされなかったことを示します。また、imagesはディレクトリファイルで処理の対象外であることを示します。

こちらもよく読まれています