実践 Acme::Spinner
2011-12-04
Win32 Trackが懐かしい techno-cat (@techno_neko) デス。
探し求めていたモジュールはAcmeでした
画像データを扱うと、なかなか結果が返って来なくて。それで、プログレスバーみたいなのがあればいいなーって思ってたのですが、そんな大げさじゃなくていいから、動いてるよって教えてくれるモジュールを探してました。
そして、ついに見つけてしまったのです、Acme::Spinnerを。
使い方
use strict;
use Acme::Spinner;
# 時間のかかる処理
my $spinner = Acme::Sipnner->new();
for my $i (0..100) {
print STDERR $spinner->next . "\r";
# いろいろやる
}
すると、
| \ - /
の順番でアニメーションする。
ちゃんとやる
ちゃんとアニメーションさせるには、
print STDERR $spinner->next . "\r";
が呼ばれるタイミングだったり、回数を制御しなきゃいけなくて、
例えば画像をモノクロに変換する処理の場合はこんな感じ。
use warnings;
use strict;
use Imager;
use Acme::Spinner;
my $img = Imager->new( file=>$ARGV[0] ) or
die Imager->errstr();
my $spinner = Acme::Spinner->new();
for my $y (0..$img->getheight-1) {
# ここで出力タイミングを制御
# この例だと、16の倍数で1回出力
if ( ($y & 0x0F) == 0 ) {
print STDERR $spinner->next . "\r";
}
my @colors = $img->getscanline( y=>$y );
my @pixels = ();
foreach my $color (@colors) {
my ($red, $green, $blue, $alpha) = $color->rgba;
my $y = $red + $green + $green + $blue;
$y = int( $y / 4 );
push @pixels, ( $y, $y, $y, $alpha );
}
$img->setscanline( y=>$y, pixels=>pack('C*', @pixels) );
}
$img->write( file=>'result.jpg' ) or
die "Cannot write: ",$img->errstr;
__END__
注意点としては、
STDERRにprintし過ぎるとアニメーションが急に遅くなる(?)ので、結果を見ながら出力頻度を調整しました。
まとめ
ね、便利でしょ。(棒)
さ〜て、明日はどなたでしょうか???