Imager::transform2による画像の拡大

今回は、Imager::Enginesを使って画像を生成して、
その画像を荒いドット絵みたくなるように拡大してみる。

今回用意したコードはこんな感じ。

use v5.14;
use strict;
use warnings;
use Imager;

my %opts = (
    width   => 32,
    height  => 24,
    rpnexpr => 'x y cx 0.5 - cy 0.5 - distance 12 / !d 1.0 @d lt 0.0 1.0 @d - if !dd 0 0 @dd hsv'
);

my $img_src = Imager::transform2( \%opts );

$img_src or die $Imager::ERRSTR;
$img_src->write( file => $0 . '_src.png' );

my $n = 12;
my $img_dst = Imager::transform2( {
    width => $img_src->getwidth() * $n,
    height => $img_src->getheight() * $n,
    constants => { n => $n },
    rpnexpr => 'x n / int !sx y n / int !sy @sx @sy getp1'
}, $img_src );

$img_dst or die $Imager::ERRSTR;
$img_dst->write( file => $0 . '_dst.png' );

生成した画像はこれ。
20140725-1

拡大したのはこれ。
20140725-2

ポイントとしては、
1ピクセルあたり12ピクセルに拡大するのに、
constants => { n => $n }という方法で定数を定義して、
それをrpnexprの中で使っている。

次に、入力画像のサンプリング位置を計算するのに、
実数から整数部を取得するみたいなのは、

N int — N

を使って、指定座標のRGB値を得るには、

Nx Ny getp1 — C

を使う。

最初の引数で渡した画像のRGBを取得する場合はgetp1で、
2つ目の場合はgetp2を使うことになる。

こんなことして何が面白いのか?って言われても、
個人的に面白くて仕方ないので、まだまだ続くと思う。

おしまい。

Leave a Comment