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
仕様
ソースコード
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 はこれをどう使っているか
おわりに
これで楽しいレッサーパンダ画像ライフがおくれそうです。やったあ!