PerlライブラリであるImage::SizeとLWPを組み合わせて、リンク先(外部サイトにある)の画像サイズを取得するためのTips。RSSリーダーを自作するに当たって、本文中の絵文字とアップされた画像を区別するために必要となった。当然ながら利用するにはcgiサーバにどちらもインストールされていることが条件となる(ちなみに自作したRSSリーダーは上部ナビの「公式サイト」のトップページに表示されているので興味がある方は覗いて見て欲しい)。
まずはImage::Sizeだが、これは画像サイズを取得するためのライブラリ。使い方は簡単で、以下のようにスクリプトに記述する。
use Image::Size;
($width, $height) = imgsize("取得したい画像のパス");
これで $widthと$heightには、それぞれ画像の幅と高さが格納されている(変数の値を調べるには、以前に紹介した「CGI-Perl開発におけるデバッグのTips」を参考にしてみて欲しい)。
ただし、これで取得できる画像は同じサーバ内のものに限られるため、リンク先などの外部にある画像サイズを取得するには、別に画像を取得してやる必要がある。そのために利用するのが、Perl 用のWWWライブラリモジュール群であるLWPだ。LWPで外部から画像を取得する方法は、以下の2つ。
LWP::Simpleを利用する場合、次のように記述する。
use LWP::Simple;
$url = '取得したい画像アドレス';
$get_img= get $url;
出力される結果はテキスト形式なので、意味不明の文字が並ぶがサイズを取得する上では問題ない。あとは$get_imgをImage::Sizeに受け渡せば良い。
私の環境下ではこの方法で問題なく取得できたのだが、一部にLWP::Simpleでは取得できないページがあるというような報告があったので、 別の方法も合わせて紹介する。LWP::Simpleで取得できない理由は、User-Agentリクエストヘッダがないことが原因のようなので、WP::UserAgentを利用する。
use LWP::UserAgent;
$ua = LWP::UserAgent->new;
$req = HTTP::Request->new(GET => "取得したい画像アドレス");
$res = $ua->request($req);
$get_img = $res->content;
あとはLWP::Simpleと同じである。
ついでに私はPerlのローカルテスト環境にAN HTTPD+ActivePerlをメインに利用しているのだが、デフォルトのActivePerlにはImage::Sizeがインストールされていなかったので、その方法を紹介しておく。
コマンドプロンプトから以下のように記述。
C:\Documents and Settings\user名> ppm install image::size
(C:\perl\にActivePerlがインストールされている場合。ppmはPerlのパッケージマネージャー)