sizana
画像の大きさを取得する Perl ライブラリ
Perl5
sizana とは
sizana は各種画像の大きさ(幅、高さ)を取得するだけの Perl のライブラリです。 とりあえずよく使われるフォーマットだけおさえてあります( PICT スルーしてますが :p )。
もう少し幅広く対応させたいと思いましたが、仕様書探して読んで・・・という作業が 苦痛になってきたのでしばらくは他のフォーマットは放置させてもらいます。
対応するフォーマット
- BMP (DIB) [ Windows , OS/2 ]
- JPEG [ JFIF , Exif ]
- GIF [ 87a , 89a ]
- TIFF
- JPEG 2000
- PNG
- MNG
- JNP
- ICON ( おまけ )
※ ICON は複数のイメージが格納されていても一つ目の大きさしか返しません
DownLoad
sizana DownLoad
使い方と解説
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 の場合通常 Windows か OS/2 のどちらか。
- もし ? から始まる ?Windows という文字列である場合 一応取得はしたが未知のフォーマットである可能性を示唆する。
- gif
- GIF の場合必ず 87a か 89a のどちらか。
- jpeg
- JPEG の場合通常 JFIF か Exif のどちらか。
- もしかしたら空かもしれないし ? から始まる違う文字列 かもしれない。 その場合一応取得はしたが未知のフォーマットである可能性を示唆する。 (つまり値は誤爆しているかも、ということ)
- tiff
- TIFF の場合必ず Intel か Motorola のどちらか
- png , mng , jng
- どれも通常は空。
- もし ? から始まる文字列 ( e.g., ?png ) の時は 一応取得はしたが誤爆かもしれない可能性を示唆する。
- 多少特殊な値
-
- jpeg2000
- JPEG 2000 の場合 jp2 確定に至ったチャンク名 ftyp か prfl のどちらか。
- これ以外のときは未知のフォーマットか仕様に反したエンコーダ で作られたモノを意味する。つまり誤爆の可能性を示唆する。
- icon
- ICON の場合は埋め込まれている画像の数。
- 正直フォーマットによく分からない箇所がある為中途半端 :(
未知のフォーマットの扱い
基本的に第3返り値 ( $format ) に unknow が返ります。
なんとか取得できたっぽい時には $supplement の値に ? から始まる 文字列が入ります。この場合の返り値をどう扱うかは貴方に委ねられます。 ( ? 以降の文字列はフォーマットにより異なります。具体的な 文字列は上述の $supplement の項を参考にしてください )
もし PNG 系のフォーマットぽかった場合は取得を試みます。
(これは`まず`在りえないですが)
この場合 $format には _png という文字列が入ります。
$supplement には ? から始まる ?*ng という文字列が入ります。
実際には ?*ng の * には a-z が入ります ( e.g., ?gng )。
誤爆判定
# 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 の識別子が含まれない場合 ? が付きます
- その他
- 今のところその他に ? が付くことはありません
Copyright(C) 2002-2005 kerry.