Schwarz Lanzenreiter forward

sizana

画像の大きさを取得する Perl ライブラリ

Perl5


PHP 版もあります

sizana とは

sizana は各種画像の大きさ(幅、高さ)を取得するだけの Perl のライブラリです。 とりあえずよく使われるフォーマットだけおさえてあります( PICT スルーしてますが :p )。

もう少し幅広く対応させたいと思いましたが、仕様書探して読んで・・・という作業が 苦痛になってきたのでしばらくは他のフォーマットは放置させてもらいます。

▲ TOP

対応するフォーマット

※ ICON は複数のイメージが格納されていても一つ目の大きさしか返しません

▲ TOP

DownLoad

sizana DownLoad

▲ TOP

使い方と解説

example;

($width, $height, $format, $supplement) = sizana::getsize( $file );

$file

調べたいファイルのパス。

$width

画像の幅 ( 0xFFFF 以上とかありえないと思われる値が入っていたら誤爆 )。 ICON の場合は一番最初に格納されているもの。

$height

画像の高さ ( 0xFFFF 以上とかありえないと思われる値が入っていたら誤爆 )。 ICON の場合は一番最初に格納されているもの。

$format

画像のフォーマットが以下の文字列で入る。

jpeg | bmp | gif | tiff | png | mng | jng | jpeg2000 | icon

未対応のフォーマットであった場合は unknow という文字列が入る。

$supplement

付加情報が入る。? から始まる文字列であった場合は取得した 幅、高さの値が誤爆の可能性を示唆している。後述。

error という文字列が入っていた場合
$format が空ならファイルを開けなかったことを意味する。
$format にフォーマット名が入っていた場合は解析に失敗したことを意味する。 これはファイルが壊れているとか正しいフォーマットではないとか誤爆とか。。 $width、$height に数値が入っていても信じてはいけません。
通常は以下の具体的なフォーマット名が入る。
bmp
BMP の場合通常 WindowsOS/2 のどちらか。
もし ? から始まる ?Windows という文字列である場合 一応取得はしたが未知のフォーマットである可能性を示唆する。
gif
GIF の場合必ず 87a89a のどちらか。
jpeg
JPEG の場合通常 JFIFExif のどちらか。
もしかしたら空かもしれないし ? から始まる違う文字列 かもしれない。 その場合一応取得はしたが未知のフォーマットである可能性を示唆する。 (つまり値は誤爆しているかも、ということ)
tiff
TIFF の場合必ず IntelMotorola のどちらか
png , mng , jng
どれも通常は空。
もし ? から始まる文字列 ( e.g., ?png ) の時は 一応取得はしたが誤爆かもしれない可能性を示唆する。
多少特殊な値
jpeg2000
JPEG 2000 の場合 jp2 確定に至ったチャンク名 ftypprfl のどちらか。
これ以外のときは未知のフォーマットか仕様に反したエンコーダ で作られたモノを意味する。つまり誤爆の可能性を示唆する。
icon
ICON の場合は埋め込まれている画像の数。
正直フォーマットによく分からない箇所がある為中途半端 :(

▲ TOP

未知のフォーマットの扱い

基本的に第3返り値 ( $format ) に unknow が返ります。

なんとか取得できたっぽい時には $supplement の値に ? から始まる 文字列が入ります。この場合の返り値をどう扱うかは貴方に委ねられます。 ( ? 以降の文字列はフォーマットにより異なります。具体的な 文字列は上述の $supplement の項を参考にしてください )

もし PNG 系のフォーマットぽかった場合は取得を試みます。 (これは`まず`在りえないですが)
この場合 $format には _png という文字列が入ります。 $supplement には ? から始まる ?*ng という文字列が入ります。 実際には ?*ng の * には a-z が入ります ( e.g., ?gng )。

▲ TOP

誤爆判定

# example;

if ( $supplement eq 'error' ) 
{
    # エラー
}
elsif ( $format eq 'unknow' )
{
    # 未対応のフォーマット
}
elsif ( $width > 0xFFF or $height > 0xFFF )
{
    # 通常ありえない値。多分誤爆
    # 注 1
}
elsif ( $supplement =~ /^\?/ )
{
    # 確信がもてない。誤爆かも?
    # 注 2
}

注 1 : フォーマットによって値が Short か Long かに分かれる。 ありえない値は小さい方の形にあわせるべきなので例の 0xFFF とした ( MSB をみてる格好 )。 ただ 0xFFF ( 10進数で 4095 ) は "ありえないないコトもない" ので 適当に 0xFFF - 0xFFFF の間位で好きなように自身の思う "ありえない値" を決めればいいと思ふ ;p

注 2 : 誤爆の可能性がある為判断は貴方に委ねます。 参考までに各フォーマットで ? が付く判定材料を以下に。

BMP 系
BMP のヘッダ・サイズは固定のハズなのでサイズがおかしい時に ? が付きます
PNG 系
PNG の IHDR チャンクは最初に現れる必要がある。つまり シグネチャの次にすぐ IHDR チャンクがあるハズなので決まった位置に 見つからなければ ? が付きます
JPEG 系
JPEG は APPn マーカが無い時。 又は APPn マーカが有りデータに識別子が含まれない時。 又は APPn が有っても APP0, APP1 以外だった時に ? が付きます。
JPEG 2000
JPEG 2000 は ftyp か prfl チャンクが存在しない場合。又は ftyp か prfl チャンクが存在してもデータに jp2 の識別子が含まれない場合 ? が付きます
その他
今のところその他に ? が付くことはありません

▲ TOP


[PageTop] [Back] [Home]

Copyright(C) 2002-2005 kerry.