# 画像の縦横ピクセル数取得 # by kishi@orange-factory.com sub get_imagesize { # エラー報告にCarp.pm use Carp qw(croak); my $filename = shift; # 画像ファイル名 my $rise_error = shift; # エラー処理 my ( $width, $height ); # 戻り値 # ファイルが存在しないとき if ( ! -e $filename ) { if ( $rise_error ) { croak("Cannot find file [$filename]."); } else { return (0,0); } } # オープンできないとき unless ( open( IMG, $filename ) ) { if ( $rise_error ) { croak("Cannot open file [$filename]."); } else { return (0,0); } } binmode(IMG); my $buf; # GIF if( $filename =~ /\.gif$/i ){ read( IMG, $buf, 6 ); if ( $buf =~ /^GIF/ ) { read( IMG, $buf, 2 ); $width = unpack("v*", $buf); read( IMG, $buf, 2); $height = unpack("v*", $buf); } else { croak("GIF Format error") if ( $rise_error ); } } # PNG elsif( $filename =~ /\.png$/i ){ read( IMG, $buf, 8 ); if ( $buf =~ /^\x89PNG/ ) { read ( IMG, $buf, 8 ); my ( $size, $type ) = unpack( "NA4", $buf ); if ( $type ne 'IHDR' ) { read( IMG, $buf, 8 ); ($width, $height) = unpack("NN", $buf); } else { croak("PNG Format error") if ( $rise_error ); } } else { croak("PNG Format error") if ( $rise_error ); } } # JPEG elsif ( $filename =~ /\.jpe?g?$/i ) { seek( IMG, 0, 0 ); read( IMG, $buf, 2 ); # FFD8 = JPEGファイルの先頭 if ( $buf =~ /^\xFF\xD8$/ ) { my $skip_size; # マーカーごとに読む while ( read( IMG, $buf, 2 ) ) { # 画像サイズはFFC0マーカーで記述 if ( $buf =~ /^\xFF\xC0$/ ) { seek( IMG, 3, 1 ); read( IMG, $height, 2 ); $height = unpack("n*", $height); read( IMG, $width, 2 ); $width = unpack("n*", $width); last; } # FFD9 = ファイル終端 # FFDA = イメージデータそのもの elsif ( $buf =~ /\xFF(?:\xD9|\xDA)/ ) { last; } # FFC0にたどり着くまでは読み飛ばす elsif ( $buf =~ /\xFF(?:[\xE0-\xED]|\xFE|\xDB|\xDD|\xC4)/ ) { read( IMG, $buf, 2 ); $skip_size = unpack("n*", $buf) - 2; seek( IMG, $skip_size, 1 ); } } } else { croak("JPEG Format error") if ( $rise_error ); } } # その他 else { croak("Bad filename [$filename]") if ( $rise_error ); } close( IMG ); return( $width, $height ); }