M.C.P.C.: Favicon API α版の代わりに自サイトにAPIを設置する
にて、Windows ICO形式のFaviconをGIF形式に保存しなおすために、ImageMagick(と、PerlバインディングImage::Magick)を使っていたのですが、複数のアイコンが入っているICOへの対応が難しく、むりくり対応させても今度はImageMagickのバージョンによってICOの解釈がうまくいかなかったりしていました。
これを解決するために、favicon.hatena.ne.jpの非公開APIをキャッシュの期限を充分長くしたうえで使って、それで2年ぐらい運用してきたのですけれども、このAPI、もともとはてなブックマークで使われている内部APIなので、「はてなブックマークされたサイトでないとFaviconが取得されていない」という仕様であることがさっきわかりました!
そこで、Image::MagickとImagerの比較をして、使い勝手を確認しました。
use strict;
use warnings;
use Image::Magick;
use Imager;
use LWP::Simple;
my $data = get('http://www.yahoo.co.jp/favicon.ico');
#use_image_magick( $data );
use_imager( $data );
exit;
sub use_image_magick {
my $data = shift;
my $im = Image::Magick->new;
$im->set( Magick => 'ico');
$im->BlobToImage($data);
# ↑ICOに複数のイメージが入っているとNG
# ファイルに書き出せば$im->Read('hoge.ico[0]')などで取り出せる
$im->Resize(width => 16, height => 16);
$im->Write('favicon.png');
undef $im;
}
sub use_imager {
my $data = shift;
my $im = Imager->new;
$im->read( data => $data, type => 'ico' );
$im = $im->scale( xpixels => 16, ypixels => 16, type => 'min' );
$im->write( file => 'favicon.png' );
undef $im;
}
__END__
実際に200サイトぐらいで比較してみたら、Image::Magickのほうは、(事情によりImageMagickのバージョンを上げることができないため)Faviconが化けることがありましたが、Imagerのほうは結構平気でした。
yumみたいなパッケージ管理システムでいろんなライブラリを入れる必要がありますが、rootを持っている人ならばImagerを使ってみると捗るかもしれません。