Perl Image::ExifTool 画像ファイルを撮影日時にリネームするスクリプト

/ Perl / Comment[0]
apt-getでImage::ExifToolをインストールしました。個人的にCPANはあまり使いません。
$ sudo apt-get install libimage-exiftool-perl

まずは基本的な使い方
exif.pl
use Image::ExifTool;

$file = shift;

#ExifToolオブジェクトを作る
$exifTool = new Image::ExifTool;

#画像ファイルからメタ情報を展開
$exifTool->ExtractInfo($file, \%options);

#画像ファイル中の有効なExifタグを列挙
@tagList = $exifTool->GetFoundTags('File');

#列挙したExifタグの値を一つずつ表示していく
foreach (@tagList) {
print "$_:\t", $exifTool->GetValue($_), "\n"
}

$ perl exif.pl DSC_0005.jpg
ExifToolVersion:       8.60
FileName: DSC_0005.jpg
Directory: .
FileSize: 3.1 MB
FileModifyDate: 2014:03:13 21:54:20+09:00
FilePermissions: rwxr--r--
FileType: JPEG
MIMEType: image/jpeg
ExifByteOrder: Big-endian (Motorola, MM)
Make: Sony
Model: SO-02E
Orientation: Horizontal (normal)
XResolution: 72
YResolution: 72
ResolutionUnit: inches
Software: 10.1.D.0.343_3_f600
ModifyDate: 2013:05:04 14:39:15
YCbCrPositioning: Centered
ExposureTime: 1/1600
FNumber: 2.4
ISO: 40
ExifVersion: 0220
DateTimeOriginal: 2013:05:04 14:39:15
CreateDate: 2013:05:04 14:39:15
(略)


必要な情報だけを取り出してみる
use Image::ExifTool;

$file = shift;
$exifTool = new Image::ExifTool;
$exifTool->ExtractInfo($file, \%options);

$make = $exifTool->GetValue('Make');
$model = $exifTool->GetValue('Model');
$date = $exifTool->GetValue('DateTimeOriginal');

print "機種: $make $model\n撮影日: $date\n";

$ perl exif.pl DSC_0005.jpg
機種: Sony SO-02E
撮影日: 2013:05:04 14:39:15


Docomoの機種特有なのか知りませんが、画像を取るとDCM_xxxx.jpgというように連番で保存されるのですが、
例えばその画像を別媒体などへ移動させた後に、撮影をすると移動させたものと同じ番号から画像が保存されてしまいます。
その状態で同じ媒体に移動しようとすると上書き警告が表示され、わざわざ一つ一つリネームせざるおえないという大変面倒な事態になります。
そこで、Exif情報から抽出した日付というユニークで管理しやすい名前にリネームするスクリプトを書いてみました。

Usage:
$ perl exif_date_renamer.pl /storage/pictures/dcim (絶対パス)
#!/usr/bin/perl
use File::Find;
use File::Basename;
use Image::ExifTool;

find(\&findpath, shift);

sub findpath {
$file = $File::Find::name;
if($file =~ /\.jpg$/) {
$exiftool = new Image::ExifTool;
$exiftool->ExtractInfo($file, \%options);

$maker = $exiftool->GetValue('Make');
$model = $exiftool->GetValue('Model');
$date = $exiftool->GetValue('DateTimeOriginal');
$date =~ s/://g; $date =~ s/ //g;

if($maker eq 'Sony' && $model eq 'SO-02E') {
$imgdir = dirname $file;
$newname = "$imgdir/$date";
if(-f "$newname.jpg") {
$cnt++;
print "[!] $file => $newname\_$cnt.jpg\n";
rename $file, "$newname\_$cnt.jpg";
} else {
print "$file => $newname.jpg\n";
rename $file, "$newname.jpg";
}
}
}
}
Exifに記録される時間は1秒単位のため、1秒あたり複数枚以上の画像がある場合はとりあえず連番を付けることで上書きを回避するようにしてみました。
あくまで自分のスマフォで撮った画像用の簡易的な画像のリネームツールです。

Image::ExifTool - cpan
関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可