Imager::transform2による画像生成(1)
Imager::Enginesがあまりに面白いので、適当にコードを書いてみる。
とりあえず、サイズを指定して画像を生成する。
use v5.14;
use strict;
use warnings;
use Imager;
my %opts = (
width => 100,
height => 100,
rpnexpr => '255 255 255 rgb'
);
my $img = Imager::transform2( \%opts );
$img or die $Imager::ERRSTR;
$img->write( file => $0 . '.png' );
これを、”aaa.pl”ってファイルで保存して実行すると、
“aaa.pl.png”ができる。
使っているのはこれ。
Nr Ng Nb rgb — C
ピクセルの数だけrpnexprが呼ばれるので、
その都度、R:255,G:255,B:255をセットしている。
出力サイズは、widthとheightで指定している。
それと、最後に色を返す必要がある。
Nは”numeric”でCは”color”って書いてあって、
Nr Ng Nb rgb — C
は、
3つの数字を、色情報として格納する
って意味だと思う。
(だったら、 -- じゃなくて、 -> の方が良いかな。。。)
次に、rpnexprの中で、
現在、どのピクセルを処理しているか分かるように、
xとyが使えるので、それを使うとこんな感じになる。
use v5.14;
use strict;
use warnings;
use Imager;
my %opts = (
width => 256,
height => 256,
rpnexpr => 'x 0 y rgb'
);
my $img = Imager::transform2( \%opts );
$img or die $Imager::ERRSTR;
$img->write( file => $0 . '.png' );
だいたい、予想付くと思うけど、
左上がR:0,G:0,B:0なので黒、
右下がR:255,G:0,B:255なので紫になる。
他にもHSVを使うとこんなことも。
use v5.14;
use strict;
use warnings;
use Imager;
my %opts = (
width => 256,
height => 256,
rpnexpr => 'x w / 360 * !hh y h 1 - / !vv @hh 1.0 @vv hsv'
);
my $img = Imager::transform2( \%opts );
$img or die $Imager::ERRSTR;
$img->write( file => $0 . '.png' );
これは、
xをw(画像の幅)で割って、360を掛けてhhに代入、
yをh(画像の高さ)から1引いたもので割ってvvに代入、
H:hh,S:1.0,V:vvを色として格納している。
結果はやってみてのお楽しみ。
おしまい。

Leave a Comment