(このエントリのオリジナルは、M.C.P.C.: 縦長連続画像を分割してムフフです)
縦長に連続したコマが連なっている画像、どうやって見ていますか? 最近のグラフィックビューアだと、画像サイズに合わせて拡大縮小してくれたりするのですけれども、そもそも縦長に過ぎる画像だと、拡大率を、長辺に合わせたら画像がよく見えないし、かといって短辺に合わせたら、全部見るのにスクロールして見なくてはなりません。
だから、そんな画像、Perlと言う名の青龍刀で切り刻んでしまいましょう!
モジュールの準備
今回使うモジュールは、Image::Magickというものですのが、一昔前まではインストールにちょっとコツが必要なモジュールだったと思います。また、使っているOSやPerlによっても入れ方が微妙に違うので説明が面倒ですから、各自調査してください。
WindowsのActivePerl 5.8.xを使っていて、スタートフォルダのプログラムグループに、Perl Package Managerというプログラムが表示されている場合は、こちらにインストールの仕方を掲載してあります。
スクリプト
Image::Magickの使い方は、
:: Cepheid :: - ImageMagickの使用例に詳しいです。
Filename: split_image.pl
#!/usr/bin/perl
# Filename: split_image.pl
# 400x300の画像に切り出します
use strict;
use warnings;
use Image::Magick;
use File::Basename;
our $frame_width = 400;
our $frame_height = 300;
# main
foreach ( @ARGV ){
my $filename = $_;
print "$filename\n";
if ( -e $filename ) {
cut_img( $filename );
}
}
exit;
sub cut_img {
my $filename = shift;
our ( $frame_width, $frame_height );
my $img_orig = Image::Magick->new;
$img_orig->Read( $filename );
# via http://www.ss.iij4u.or.jp/~somali/web/im_example/get.html
my ($width, $height) = $img_orig->Get('width', 'height');
my $frame = $height / $frame_height;
if ( $frame > 1 ) {
for ( my $i = 0; $i < $frame; $i++ ) {
my $img = $img_orig->Clone();
# via http://www.ss.iij4u.or.jp/~somali/web/im_example/crop.html
$img->Crop( width => $frame_width,
height => $frame_height,
x => 0,
y => $frame_height * $i,
);
$img->write( make_filename( $filename, $i ) );
undef $img;
}
}
undef $img_orig;
return;
}
sub make_filename {
my $path = shift;
my $num = shift;
my($filename, $directories, $suffix)
= fileparse($path, qr/\.[^.]*/ );
return "$directories${filename}_$num$suffix";
}
__END__
おもしろくない解説は、[続きを読む]以降に。
実行例
実行前に警告! ファイル上書きされても関知しません!
懐かしの外人4コマでやってみました。
使用前

コンソール
D:\4koma>split_image.pl 01_0001_2.jpg 01_0001_2.jpg D:\4koma>使用後

というわけで、今回は、縦長連続画像を分割するという、インターネットに長くいる人ほどなぜか有用性が分かるというスクリプトを作ってみました。
これ何に役立つの、ていう人もいるかもしれませんけれども、こういう地味ーなのって、Webのバックヤードでこっそり役立っていたりするんですよね。
解説
このスクリプトは、コマンドライン引数を画像ファイルと見なし、設定したサイズで分割して、画像ファイルにアンダースコア+連番を付けてフレームごと書き出します。
# main
foreach ( @ARGV ){
my $filename = $_;
print "$filename\n";
if ( -e $filename ) {
cut_img( $filename );
}
}
exit;
コマンドラインでの引数は@ARGVに入るので、foreachで取り出し、入っている分だけ処理します。
sub cut_img {
my $filename = shift;
our ( $frame_width, $frame_height );
my $img_orig = Image::Magick->new;
$img_orig->Read( $filename );
# via http://www.ss.iij4u.or.jp/~somali/web/im_example/get.html
my ($width, $height) = $img_orig->Get('width', 'height');
my $frame = $height / $frame_height;
if ( $frame > 1 ) {
for ( my $i = 0; $i < $frame; $i++ ) {
my $img = $img_orig->Clone();
# via http://www.ss.iij4u.or.jp/~somali/web/im_example/crop.html
$img->Crop( width => $frame_width,
height => $frame_height,
x => 0,
y => $frame_height * $i,
);
$img->write( make_filename( $filename, $i ) );
undef $img;
}
}
undef $img_orig;
return;
}
最初に画像全体の大きさを取得して、コマ数を割り出します。
コマ数が1コマだったら処理しない。
コマ数が1コマより大きかったら、分割処理します。
分割処理は、最初に読んだ画像を複製(my $img = $img_orig->Clone(); )して、好きな大きさにトリミングします( $img->Crop(); )。
できあがった画像を、連番ファイル名を生成して書き出します。
sub make_filename {
my $path = shift;
my $num = shift;
my($filename, $directories, $suffix)
= fileparse($path, qr/\.[^.]*/ );
return "$directories${filename}_$num$suffix";
}
ここは、fileparseっていうのがありますが、これはFile::Basenameモジュールで使えるようになります。フルパスから、パス、ファイル名、拡張子を分離してくれます。分離したところで、アンダースコアと連番を差し込んで、書き出しようファイル名を生成しています。



Leave a comment