• このエントリーをはてなブックマークに追加

はじめに

CPANモジュール Image::Size を使って画像サイズを取得できないケースに遭遇したのでメモ.

なお,モジュールのバージョンは 3.230 です.

現象

同モジュールを入れると imgsize コマンドを利用できるようになります.本来であれば次のような感じ:

% imgsize /path/to/img_ok.jpg
width="2693" height="1800"

しかし,次のようなケースに遭遇しました:

% imgsize /path/to/img_ng.jpg
Use of uninitialized value in printf at /home/www/perl5/perlbrew/perls/perl-5.14.2/bin/imgsize line 61.

Perlスクリプトとして実行してみたら,次のようになりました:

% perl -MImage::Size=imgsize -MData::Dumper -le 'print Dumper [ imgsize("/path/to/img_ng.jpg") ]'
$VAR1 = [
          undef,
          undef,
          'Data stream is not a known image file format'
        ];

うーん,画像フォーマットの識別がうまくいっていないのかな,と推測.

ひとまずの対処法

同モジュールのソースをざっと眺めてみると,Image::Magick モジュールを読み込んでいれば,そのメソッド ->Get() を使ってくれることがわかったので,とりあえずはそんな感じで対処:

% perl -MImage::Magick -MImage::Size=imgsize -MData::Dumper -le 'print Dumper [ imgsize("/path/to/img_ng.jpg") ]'
$VAR1 = [
          2693,
          1800,
          'Joint Photographic Experts Group JFIF format'
        ];

取得できました!

おわりに

以上,Image::Size モジュール(または imgsize コマンド)で画像サイズ情報を取得できないケースに遭遇して,アドホックに対処したお話でした.

また,imgsize($file, { format => 'jpeg' }) のような感じで画像フォーマットを強制的に固定できるようになってもいいんじゃないかな,とか思ったりしました.

あとでもう少し詳しくソースを読んでみるとします.