前回のアクセスカウンタを作った話の続きです。あのカウンタはgifファイルを連結して表示していたのですが、バックが透明の場合、gifファイルだと縁のジャギーがちょっと気になるので、pngファイルで連結できないか調べてみました。
ネットで調べてもそのものズバリなものはなかなか出てきません。どうやら単独でモジュールを作るのではなく、PerlのグラフィックモジュールのGDかPerlMagickを使って画像処理をしているようです。そこで、うちのレンタルサーバーのLaCoocanでも使えるPerlMagickを使って、pngファイルを連結するプログラムに変更してみました。
現在のアクセスカウント値
(前回の記事もプログラムが更新されているので、同じpng表示になっています)
PerlMagickというのは、PerlモジュールImage::Magickのことで、ImageMagickライブラリをPerlから使えるようにしたものです。
で、早速使おうと思ったところ、Perlでどう書いていいのかよく分からんw。PerlMagickのページで解説されているのですが、いかんせん英語で...。
#!/usr/local/bin/perl -wT
use strict;
use Image::Magick;
...
# $image_dir は数字イメージファイルのディレクトリ
# 数字イメージファイルのディレクトリ内には、0.pngから9.pngのpngファイルあり
# $count にはアクセスタウンタの値が整数で入っている状態
...
my $count_length = length($count); # 桁数
my $image = Image::Magick->new;
my $i = 0;
my $n = '';
for ($i = 0; $i < $count_length; $i++) {
$n = substr($count, $i, 1);
$image->Read("$image_dir$n.png");
}
my $append_image = $image->Append(stack => 'false'); # false:横に連結
undef $image;
print "Content-type: image/png\n\n";
binmode STDOUT;
$append_image->Write('png:-');
ふぅ、なんとか試行錯誤でできました。ちなみに赤字はPerlMagickの部分で、出来てからPerlMagickのドキュメントを読み返すと、悩んだところはちゃんと解説されているし...w。
簡単に解説すると、$imageのイメージオブジェクトを作成して、Readで左のpngファイルから順に読み込んで、Appendで連結して、Writeで連結したpngファイルを書き出しています。この中で、$imageに桁数分の違うファイルを読み込んでいますが、このオブジェクトはこんな風に使えるようです。普通の変数のように見えるので、ちょっと違和感がありますが...。
PerlMagickを使うとPerlで色々な画像処理が出来るようなので、興味のある方は使ってみるといいかも。