PerlMagickによる画像連結

2011年になり、はやくも1週間が過ぎてしまいましたね!
みなさん、元気にプログラム書いてるでしょうか!
僕は仕事以外ではあまり書けてません。
1月2日にちょろっと書いたくらいでしょうか。
今日は、その2日に書いたものを紹介します。

やりたかったこと

  • 画像を横とか縦とかに連結すること

携帯電話でレッサーパンダ画像を集めていると、240×320というサイズの画像がいっぱい集まります。
これらの画像をそのままPCに取り込んで保管していてもいいのですが、個人的にはディスプレイを完全につかってレッサーパンダ画像を眺めたい。
そのためには、小さなサイズの画像を連結して、大きな画像にしたい。


今までは、google:JTrim というソフトウェアを使っていたのですが、画像の枚数が多くなってくると、1枚ずつ連結させていくのは大変。
なのでこういう作業はプログラムにやらせちゃいましょう、というのが動機でした。

PerlMagickによる画像連結

僕が最近メインで使っている言語は Perl なので、Perl でこれをやらせたい。
いろいろ調べたところ、google:PerlMagick を使えばできることがわかったので、これを使ってみることにしました。

まずはPerlMagickを使えるようにする

Windiows + ActivePerl という環境でこれを実現します。
まずは PerlMagick - It_lives_vainlyの日記 を参考に、PerlMagick を使えるようにしました。

 C:\Users\shiget84>ppm rep add "bribes" http://www.bribes.org/perl/ppm
 Downloading bribes packlist...done
 Updating bribes database...done
 Repo 2 added.
 
 C:\Users\shiget84>ppm install perlmagick
 Downloading PerlMagick-6.6.3...done
 Unpacking PerlMagick-6.6.3...done
 Generating HTML for PerlMagick-6.6.3...done
 Updating files in site area...done
  149 files installed
仕様
  1. カレントディレクトリに images というディレクトリと、 out というディレクトリを用意。
  2. images に連結元となる画像を複数枚用意する。
  3. コマンドからプログラムを実行する。引数は1つで、何個{横|縦}に連結するかを指定する。
  4. プログラムが正常終了すると、 out ディレクトリに画像が保存される。
ソースコード

http://snoop.to/bbbs/logs/20070612181128.html#m4 を見つつコードを書きました。


以下、ソースコード

 #!/usr/bin/perl
 use strict;
 use warnings;
 use Image::Magick;
 
 # 何個横に連結するかを指定する
 if( @ARGV != 1 ) {
     print "引数の数が1つではありません\n";
     exit 1;
 }
 
 my $num = $ARGV[0];
 my $count = 0;
 
 # images ディレクトリ以下のファイルをすべて取得
 my @all_files = glob "./images/*";
 my @jpg_files;
 
 # 対象ファイルの取得
 foreach(@all_files) {
     if(/.jpg$/) {
         push(@jpg_files, $_);
     }
 }
 
 # 画像処理を行っていく
 my $image = Image::Magick->new;
 foreach my $file ( sort @jpg_files) {
     $count = $count + 1;
     
     $image->Read($file);
     
     if ($count % $num == 0) {
         # 出力ファイル名(現在時刻)
         my $now = time;
         my $outFilePath = sprintf("./out/"."%d"."_"."%03d".".jpg", $now, $count);
         
         # 結合オブジェクトを新規作成
         # (stack=>'false')で横に結合
         # (stack=>'true')で縦に結合
         my $append = $image->Append(stack=>'false');
         $append->Write($outFilePath);
 
         $image = undef;
         $image = Image::Magick->new;
     }
 }
 
 exit 0;
注意点
  • エラーチェックとかあまりちゃんとやってません。
  • images ディレクトリに24枚の画像があて、5枚ずつ連結すると指定した場合、5枚ずつ連結された4つのファイルができます。残り4枚は連結されません。
  • 24枚の画像を4×6にしたい場合、stack=>'false' と stack=>'true' で2回プログラムを実行する必要があります。

shiget84 はこれをどう使っているか

  1. stack=>'false' のプログラムと stack=>'true' のプログラムを2つ用意する
  2. Windows のバッチファイルで、「縦に4コ連結」「横に6コ連結」とかを用意する
  3. images ディレクトリに画像を用意する
  4. バッチファイルをダブルクリックで実行する

おわりに

これで楽しいレッサーパンダ画像ライフがおくれそうです。やったあ!