Imagerを使おう - 第1回「画像の読み書き」
まず第1回目は、とりあえず画像を読み書きの方法から。
Imagerで画像を読み込むには、read()というメソッドを使用します。
my $img = Imager->new->read(file => 'foo.jpg', type => 'jpg');このようにfileにファイル名を、typeにその画像の形式を渡すと、foo.jpgという画像ファイルをjpg形式で読み込んでImagerのインスタンスを生成することができます。この例ではカレントディレクトリにfoo.jpgというファイルがあることが前提となります。当たり前ですが絶対パスも指定することができます。typeはファイル名に拡張子がある場合には省略することもできます。
上の例はファイルを指定して画像データを読み込んでいますが、Imagerではファイルを指定して読み込む以外にも、ファイルハンドル、ファイルディスクリプタ、生データなどからもインスタンスを生成することができます。
my $img = Imager->new->read(fh => $fh, type => 'jpg'); my $img = Imager->new->read(fd => $fd, type => 'jpg'); my $img = Imager->new->read(data => $data, type => 'jpg');余談ですが、Imagerでは生データであるdataが使えるので、例えばmemcachedに画像データを一時キャッシュしてそれを利用するなんてこともできます。変換を何度もしなければならないような要件のときに、いちいち/tmpなどに書き出さなくてもmemcachedなどに一時保存することでI/Oを減らすことができたりしますね。
次に書き込みの方について紹介します。画像の書き込みは、write()というメソッドを使います。
$img->write(file => 'bar.jpg', type => 'jpg');これもread()メソッドと同様にfileとtypeという値を渡しています。そしてこれまたtypeはfileに拡張子があれば省略することが可能です。もちろん、file以外にも fh, fd, data に出力すること可能です。この辺の詳細については、Imager::Files をご覧ください。
さて、これで基本的な読み書きができるようになりましたが、忘れてならないのがアニメーションGIFです。アニメーションGIFの場合には何枚かの画像が1つになっているものですので、このインターフェイスでは対応できませんね(といっても実は上記の方法でも読み込みは出来てしまいますが)。ということでアニメーションGIFの読み込み方法をご紹介します。
アニメーションGIFを読み込むときには read_multi()というメソッドを使用します。具体的な使い方は下記になります。
my @imgs = Imager->read_multi(file => 'foo.gif', type => 'gif');この例では、foo.gifというアニメーションGIFを読み込んで、それぞれのフレーム毎のインスタンスが@imgsに代入されます。 基本的にはread()をread_multi()に変えた以外は先程とほぼ同じですね。ただクラスメソッドになっているのに注意です。
そして書き込むときにはもちろん write_multi()メソッドを使います。
Imager->write_multi({ file => 'foo.gif', type => 'gif'}, @imgs);write()メソッドとは引数がちょっと違います。またread_multi()と同様にクラスメソッドになっていますので、Imager->write_multiという風に呼出す必要があります。
とりあえずこれで読み書きができるようになりましたので、次回は読み込んだ画像を加工するところをやろうと思います。
#いつまで続くのやら…。