Image::ExifTool

旅行でとった写真の日付が最初の方12時間ずれていたから一括して変更したかったんだけど、perlの勉強もかねて作ってみた。んー、どこをみてperlを勉強したらよいのかよくわからない。rubyだったら公式ページにいろいろ書いてあるしpythonだったらすばらしいチュートリアルがあるのに、、、どこにそういった類いがあるのかわからんかった。

で、作ったのがこれ。EXIFに対して全然理解がないからとりあえず、Dateと名前のつくタグについてはすべて計算の対象にしてみた。一応これで、シェルスクリプトを書けば一度にまとめていろいろ操作できる。まぁとりあえず晒してみる。


use strict;
use Image::ExifTool 'ImageInfo';
use DateTime;
use Data::Dumper;

if ($#ARGV != 1) {
&usage();
exit(1);
} elsif (!($ARGV[1] =~ /^-?\d+$/)) {
&usage();
exit(1);
}
my @modTags = qw( DateTimeOriginal RicohDate ModifyDate CreateDate);
my $target = $ARGV[0];
my $addTime = $ARGV[1];
my $info = ImageInfo($target);
my $tag;

my $exifTool = new Image::ExifTool;
$exifTool->ExtractInfo($target);
foreach $tag (@modTags) {
my $dateTime = parseDateTime($info->{$tag});
&addTime($dateTime, $addTime);
my $newVal = $dateTime->strftime("%Y:%m:%d %T");
$exifTool->SetNewValue($tag, $newVal);
}
$exifTool->WriteInfo($target);

# 日付をパースし、DateTimeオブジェクトを生成する
sub parseDateTime {
my($strDate) = @_;
my @dateTime = split(/:| /, $strDate);
my $ret = DateTime->new(year => $dateTime[0],
month => $dateTime[1],
day => $dateTime[2],
hour => $dateTime[3],
minute => $dateTime[4],
second => $dateTime[5],);
return $ret;
}

# 時間を足す
sub addTime {
my($dt, $addTime) = @_;
$dt->add(seconds => $addTime);
}

# 使い方を出力する
sub usage {
print , 'Usage: perl ' . $0 . " \n";
}