2010-10-29

[perl] Image::Imlib2 でファイルハンドルに書き込む

mixi で採用されている らしい Image::Imlib2 ですが、出力の方法がファイルに対する書き込みしかなかったので、hidekiy.com の背景画像を動的に生成するのに便利な方法を考えてみました。

IO::File->new_tmpfileで一時ファイル (tmpfile, tempfile) を作って、そのハンドル $fh のファイルディスクリプタに対して save で保存します。$fh のカーソルは先頭のままなので、$fh をそのまま PSGI レスポンスの body とかに使えばよいです。さらに変数に入れたいなら Perl6::Slurp みたいな方法で $fh を読めば OK です。

use Image::Imlib2;
use IO::File;

my $img = Image::Imlib2->new(100, 100);
$img->set_color(128, 128, 128, 256);
$img->fill_rectangle(0, 0, $img->width, $img->height);

$img->image_set_format('png');
my $fh = IO::File->new_tmpfile;
$img->save('/dev/fd/' . $fh->fileno);

$fh;