perl モジュールのImage::MagickとImage::ExifToolを使って、イメージ画像を一括縮小&画像方向補正もするコードを書いてみました。画像を正しい向きに回転させ、希望サイズ(横幅)でリサイズ(サムネイル)できるperlスクリプトです。
ちょっとPerlの勉強、実益も兼ねてイメージ画像を一括縮小&画像方向補正もするコードを書いてみました。perl モジュールのImage::MagickとImage::ExifToolを使って画像を正しい向きに回転させ、希望サイズ(横幅)でリサイズ(サムネイル)できるperlスクリプトです。
この間(3月)に後輩の結婚式によばれて、写真撮影してきたデータ(約2000枚/7GB)のリサイズデータ作ろうと思い、Image::Magick を使って大量画像のサムネイル画像を一括自動生成 :: Drk7jpで紹介されているperlを使ってのサムネイル一括スクリプトを使っていたのですが、イメージ管理ソフト(Picasa3)でのプレビュー表示と実際のデータとは写真の向きが異なるという面倒なことに後で気づき、モジュールImage::Magickの勉強も兼ね、Exif情報から写真回転方向を取得し、その値からイメージデータをを正しい向きに修正するという機能も備えたコードを書いてみました。イメージ管理ソフト(Picasa3) 、画像データ取得時にExif情報を抜き出し、プレビュー表示で実際のデータでの向きとは関係なく、見やすい状態で表示してくれるという便利なところはいいのですが、編集・保存したデータはプレビューと同じ向きになっていないという面倒があります。 なんとも。
元画像が3872×2592ピクセル(およそ8M)のイメージファイルを2000枚、横幅400ピクセルにリサイズ(アスペクト比を維持)、回転方向を正しく修正して、別フォルダに保存の作業を15分ほどで終了しました。perl便利ですね。
Ubuntu(9.04)でも向きを見やすい方向に修正してサムネイル表示(アイコン表示)してしまうので、これまた気が付くのが遅かったら面倒なことに。(ちなみにUbuntuでもPicasa使えます便利。)
コード表示の前に以下のサイトを参考にしました。ありがとうございます。
- Image::Magick を使って大量画像のサムネイル画像を一括自動生成 :: Drk7jp
- Image::Magickによるサムネイル生成高速化 - はかますたいる!【きょろの技的雑記】
- JPEGのExifタグ情報のOrientaionの定義の早見表 - DQNEO起業日記
user@host: perl image_resize.pl <ファイルディレクトリパス> <縮小サイズ(横幅)>
例)cool@coolniikou: perl image_resize.pl /home/coolniikou/wedding/ 400
横幅400ピクセルのサムネイルを作る(回転方向修正後にイメージサイズ取得)
縮小サイズを自分で決めることができます。<元フォルダ名>+<_resize>フォルダにリサイズされたイメージ画像が保存されます。
image_resize.pl
#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
use File::Find;
use Image::ExifTool;
find( \&filter, $ARGV[0] );
exit;
sub filter {
my $name;
my $dir;
my $fix_width = $ARGV[1] || die "Usage: width value: $!\n";
eval {
$name = $File::Find::name;
$dir = $File::Find::dir;
return unless $name =~ /\.jpg$/gi;
##画像補正の為の回転方向取得
my $exifTool = new Image::ExifTool;
my $exifInfo = $exifTool->ImageInfo($name, 'Orientation');
my $rotation = $$exifInfo{Orientation};
my $img = Image::Magick->new( size => $fix_width.'x'.$fix_width );
$img->Read($name);
##画像彩度落
# my $lightness = 0;
# $img->Modulate( saturation => $lightness );
##画像回転(回転方向取得から)
$img->Rotate(degrees => 90 ) if ( $rotation eq 'Rotate 90 CW');
$img->Rotate(degrees => 180 ) if ( $rotation eq 'Rotate 180');
$img->Rotate(degrees => 270 ) if ( $rotation eq 'Rotate 270 CW');
## 画像縮小
my ($width, $height) = $img->Get('width', 'height');
my $n_width = $fix_width;
my $n_height = $height * ($n_width / $width);
$img->Thumbnail( width => $n_width, height => $n_height );
##画像文字入力
# $img->Annotate(text=>$$exifInfo{Orientation}, stroke=>'#FFFFFF',
# fill=>'#005599',font=>'times.ttf', pointsize=>'36',
# x=>'20', y=>'40', encoding=>'UTF-8');
binmode (STDOUT);
my ($newname) = $name =~ m!.+(/.+)\..+$!;
my $newdir = $dir . '_resize';
mkdir($newdir) unless ( -e $newdir );
print qq{$name -> $newdir$newname.jpg\n};
$img->Write("jpg:$newdir$newname.jpg");
};
if ($@) {
warn "$name : $@ \n";
}
}
_END_
余分な機能も付いていますが・・・使えるようならと思って残してあります。
怪しい部分がありましたら、ご指摘いただけると嬉しいです。よろしくおねがいします。
実益も兼ねてImage::Magickの勉強、MovableTypeプラグインでちょっとアイデアがあって、その扱いを勉強しておきたいと思っていたところだったのもあり、今回のスクリプトをたたき台に、 他いくつかの機能を実装したプラグインを作るための勉強ができてよかった。先日リリースしたAssetExif: MT4Plugins::WEB DESIGN BLOGプラグインでExifToolの使い方を勉強していたのもタイミングよかった。
今、AssetExif: MT4Plugins::WEB DESIGN BLOG用の テンプレート作成中(考え中)でちょうどストレス溜まっていたところ。ちょっとした気分転換、モチベーション維持に実益・次回につながる勉強ができるプログラムが書けてうれしい。




コメントする