Image-Size-2.99 > Image::Size

名前

Image::Size - さまざまなポピュラーな形式の画像の大きさの取得

概要

    use Image::Size;
    # globe.gifの大きさを取得
    ($globe_x, $globe_y) = imgsize("globe.gif");
    # この後は、X=60 と Y=40と仮定します。

    use Image::Size 'html_imgsize';
    # HTML生成のため'width="X" height="Y"'の形式で大きさを取得
    $size = html_imgsize("globe.gif");
    # $size == 'width="60" height="40"'

    use Image::Size 'attr_imgsize';
    # CGI.pmのルーチンに渡すことができるようなリストで大きさを取得
    @attrs = attr_imgsize("globe.gif");
    # @attrs == ('-width', 60, '-height', 40)

    use Image::Size;
    # メモリ上のバッファの大きさを取得
    ($buf_x, $buf_y) = imgsize(\$buf);
    # $buffがデータであるとします。imgsize()はスカラへのリファレンスを必要とします

説明

Image::SizeライブラリはAlex Knowles (alex@ed.ac.uk)によって書かれた、 HTMLをチェックし、imageタグに'width'と'height'パラメータを追加するツールである wwwisスクリプトを元にしています。大きさはファイル名を元に内部でキャッシュ されます。そのため(例えば点がついたリストで使われるような画像のように) 同じファイル名で何回も呼び出しても、計算は繰り返されません。

Image::Sizeは3つのインターフェースをインポートできるように提供しています:

imgsize(stream)

XとYの大きさ(順番に幅と高さ)そしてstreamの画像形式の 3つの要素を持つリストを返します。エラーは前2つの要素が未定義(undef)である ことによって示されます。そしてエラー文字列が3番目に入ります。 3番目の要素は無視することができます(そして通常は無視します)。しかし大きさを 調べるデータの形式が分からないときは便利です。

html_imgsize(stream)

streamの幅と高さ(XとY)を、生成されるHTML IMGタグに加えるのに 適したよう'width="X height="Y"'という書式になった1つの文字列で返します。 元になっているimgsizeが失敗するとundefが返されます。返されるフォーマットは HTMLとXHTMLの両方に適応しています。

attr_imgsize(stream)

streamの幅と高さ(XとY)を、TkやCGIライブラリのような 名前付きパラメータを操作のためにハッシュ・テーブルを使うルーチンに 便利な4つの要素のリストの一部として返します。典型的な戻り値は ("-width", X, "-height", Y)です。元になっているimgsizeが失敗すると、 undefが返されます。

デフォルトではimgsize()だけがインポートされます。1つあるいは3つの組み合わせを 明示的にインポートしたり、:allタグで3つすべてをインポートすることができます。

入力形式

streamとして渡すことができるデータの種類には以下の3つの形式があります:

文字列

通常のスカラー(文字列)が渡されると、それはファイル名であると想定されます (絶対またはプロセスの作業ディレクトリからの相対のどちらでも)。 そして検索され、(もしあれば)データのソースとしてオープンされます。 発生しうるエラーメッセージ(下記の診断をご覧ください)にはファイル・アクセス 問題が含まれるかもしれません。

スカラー・リファレンス

streamに渡されたものがスカラー・リファレンスであれば、イメージ・データが入っている メモリ上のバッファを指しているものとして解釈されます。

        # &read_dataはデータをどこか(WWWなど)から取得してくるものとします
        $img = &read_data;
        ($x, $y, $id) = imgsize(\$img);
        # $x と $y は大きさ、 $id はイメージの種類です
オープンされているファイル・ハンドル

3番目の選択肢は既に対象のイメージファイルに結び付けられた、オープンされている ファイルハンドル(例えばIO::Fileクラスのオブジェクトのような)を渡すことです。 当然、ファイル・ポインタが移動しますが、サブルーチンが終了する前に 元の位置に戻されます。

        # 渡された $fh はIO::File へのリファレンスです:
        ($x, $y, $id) = imgsize($fh);
        # ファイル名で呼び出すのと同じ。しかしもっと抽象的です

理解されるフォーマット

Image::Size はそれだけで、以下のフォーマットによるデータを理解し データ大きさを測ります:

GIF
JPG
XBM
XPM
PPM ファミリー (PPM/PGM/PBM)
XV サムネイル
PNG
MNG
TIF
BMP
PSD (Adobe PhotoShop)
SWF (ShockWave/Flash)
PCD (Kodak PhotoCD, see notes below)

さらにImage::Magickモジュールがあると、それによってサポートされている 種類も、Image::Sizeによってサポートされます。"注意"をご覧ください。

imgsizeインターフェースを使うと、もしプログラマが、それを保存しチェックした ければ、使われない値が3番目に返されます。この値はデータ形式を識別し、 上で挙げたものの2-3文字の省略形で表されます。これはオープンされている ファイル・ハンドルやメモリ上のデータを扱うとき、大きさと同時に形式もわからない 場合に便利です。2つのサポート・ルーチンは、この3番目の戻り値を無視します。 そのため、それを使いたいのであればベースとなるimgsizeルーチンを使わなければ なりません。

(自分がサポートしてない全てのファイルのために)代わりにImage::Magickを 使うとき、データ・タイプ識別子はImage::Magickにより報告される'format'から 直接やってきます。そのため2-3文字の省略形の形式に合わないかもしれないことに 注意してください。例えばWBMPファイルは、この場合、'Wireless Bitmap (level 0) image' と報告されるでしょう。

情報のキャッシュと$NO_CACHE

ファイル名が大きさを判定する、いずれかのルーチンに渡されると、ライブラリは デフォルトで結果の情報をキャッシュします。キャッシュを削除し更新すべきかを 判定するため、ファイルの更新時刻も記録されます。 これは元々、しばしば同じ画像要素を何度も利用するページのための属性を生成するため、 CGIアプリケーションが、このライブラリを使っていたために追加されました。

しかしキャッシュは、ファイル・システムの更新時刻の解像度を越えるような 頻度でファイルが動的に生成されるときには問題を引き起こすかもしれません。 そのため、オプションでインポートできる制御変数$NO_CACHEが導入されました。 もしこの値がfalseでない値に評価されれば(値1、NULLでない文字列などであれば)、 プログラムが、その変数をfalseに設定することにより再び有効にするまで、 キャッシュは無効になります。

パラメータ$NO_CACHEimgsizeルーチンでインポートすることが出来ます。 そしてインポート・タグ:allを使ったときにもインポートされます。もし プログラマがそれをインポートしないことを選んだとしても、 $Image::Size::NO_CACHEと完全に修飾されたパッケージ名によりアクセス することができます。

PhotoCD画像の大きさ判定

バージョン2.95では、Kodak PhotoCD画像形式のサポートが入っています。 しかしこれらの画像ファイルは他のものと大分違っています。 あるファイルは(全て同じ縦横比で)予め決められた解像度での全ての画像の ソースになります。ファイルに本来、特定の解像度にそれを制限するようなものは ないので、ここでの、このサポートはトリッキーです。

ライブラリはスケールとの対応付けを使って、これを処理します。そしてユーザー (あなた)にどのスケールで返して欲しいかを指定するように要求します。前に説明した $NO_CACHEと同じように、これはImage::Sizeを利用するアプリケーションで インポート可能なスカラー変数になります。このパラメータは$PCD_SCALEといい、 同じ名前でインポートされます。これもタグ:allを使ってインポートしたり、 $Image::Size::PCD_SCALEで参照することができます。

そのパラメータは以下の値の1つに設定されなければなりません:

        base/16
        base/4
        base
        base4
        base16
        base64

全てのPhotoCDディスクが解像度base64を持っているわけではないことに 注意してください。PCDフォーマットについてのドキュメントであれば見つけることが できるので、実際の解像度はここの一覧には入っていません。$PCD_SCALEの値は 大文字/小文字を区別しないで扱われます。そのためbaseBaseBaSeでも 同じです。デフォルトのスケールはbaseに設定されます。

ライブラリは、要求された解像度が使用できるかどうかを確認するため、 PCDファイルを十分に読み込むという努力はしないということも注意してください。 ここでのポイントは、ライブラリは効率的に処理できるため、必要できるだけ 読み込む量を少なくするということです。このため、発見される唯一、本当の 違いは、画像の方向が縦か横かということです。実際、それだけしかライブラリは 画像ファイルから取り出しません。

診断

元になるルーチンimgsizeは、エラーが発生するとリストの最初の値をundefで 返します。3番目の要素は説明のエラーメッセージが入ります。

他の2つのルーチンはエラーの場合、単にundefを返します。

さらなる例

attr_imgsizeインターフェースはTk拡張と一緒に使う場合にも適しています:

    $image = $widget->Photo(-file => $img_path, attr_imgsize($img_path));

Tk::ImageクラスはCGIと同じようにダッシュがついたオプション名を使うので、 変換は何も要りません。

このパッケージはApache Webサーバコンテキストで使う場合にも適してます。 ファイル・サイズは読込時点でキャッシュされます(変更された場合には、 更新時刻でチェックされます)。子プロセスが1つのリクエストの期間を越えて 残るmod_perl環境のための便利な特徴です。 サーバ空間でのフルパス名を取り出すためにサブリクエストを使うという機能のような、 mod_perl環境の他の点は、このモジュールにとても適しています。 これはCGIモジュールのHTML生成機能を補足します。CGI::imgはURLを欲しがりますが、 attr_imgsizeはファイル・パスを必要とします:

    # $QはCGIクラスのオブジェクトであるとします。$r はApacheリクエスト・オブジェクトです
    # $imgpathは"/img/redball.gif"のようなURLです。
    $r->print($Q->img({ -src => $imgpath,
                        attr_imgsize($r->lookup_uri($imgpath)->filename) }));

ここでの利点は、サーバドキュメント・ルートをハード・コードしなくてもよいと いうだけでなく、URLを書換えたり、他を修正する段階も含めて、 通常のリクエスト・ライフサイクルを通してApacheがサブリクエストを渡していく ことです。

注意

サイズ・データのキャッシングは入力がファイル名であるときにのみ行われます。 オープンされたファイル・ハンドルやスカラー・リファレンスは、信頼性をもって キャッシュ・データのテーブルのためのユニークなキーに変換することができません。 バッファはMD5モジュールを使ってキャッシュすることができます、そしてそれを 将来オプションとするつもりです。しかし現時点では他の要素によって、依存する リストを長くしたくはありません。

Image::Magickはハンドルではなくファイル名を扱うので、 その利用はimgsizeへの入力がファイル名で与えられた場合に制限されます。

参考資料

wwwisの説明と取得方法については http://www.tardis.ed.ac.uk/~ark/wwwis/, Image::Magick

作者

Perl module interface by Randy J. Ray (rjray@blackperl.com), original image-sizing code by Alex Knowles (alex@ed.ac.uk) and Andrew Tong (werdna@ugcs.caltech.edu), used with their joint permission.

Some bug fixes submitted by Bernd Leibing (bernd.leibing@rz.uni-ulm.de). PPM/PGM/PBM sizing code contributed by Carsten Dominik (dominik@strw.LeidenUniv.nl). Tom Metro (tmetro@vl.com) re-wrote the JPG and PNG code, and also provided a PNG image for the test suite. Dan Klein (dvk@lonewolf.com) contributed a re-write of the GIF code. Cloyce Spradling (cloyce@headgear.org) contributed TIFF sizing code and test images. Aldo Calpini (a.calpini@romagiubileo.it) suggested support of BMP images (which I really should have already thought of :-) and provided code to work with. A patch to allow html_imgsize to produce valid output for XHTML, as well as some documentation fixes was provided by Charles Levert (charles@comm.polymtl.ca). The ShockWave/Flash support was provided by Dmitry Dorofeev (dima@yasp.com). Though I neglected to take note of who supplied the PSD (PhotoShop) code, a bug was identified by Alex Weslowski <aweslowski@rpinteractive.com>, who also provided a test image. PCD support was adapted from a script made available by Phil Greenspun, as guided to my attention by Matt Mueller mueller@wetafx.co.nz. A thorough read of the documentation and source by Philip Newton Philip.Newton@datenrevision.de found several typos and a small buglet. Ville Skytt��(ville.skytta@iki.fi) provided the MNG and the Image::Magick fallback code.