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をセットしている。
出力サイズは、widthheightで指定している。

それと、最後に色を返す必要がある。
Nは”numeric”でCは”color”って書いてあって、

Nr Ng Nb rgb — C

は、

3つの数字を、色情報として格納する

って意味だと思う。
(だったら、 -- じゃなくて、 -> の方が良いかな。。。)

次に、rpnexprの中で、
現在、どのピクセルを処理しているか分かるように、
xyが使えるので、それを使うとこんな感じになる。

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なので紫になる。

20140723-1

他にも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' );

これは、
xw(画像の幅)で割って、360を掛けてhhに代入、
yh(画像の高さ)から1引いたもので割ってvvに代入、
H:hh,S:1.0,V:vvを色として格納している。

結果はやってみてのお楽しみ。

おしまい。

Leave a Comment