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' );
ポイントとしては、
1ピクセルあたり12ピクセルに拡大するのに、
constants => { n => $n }
という方法で定数を定義して、
それをrpnexpr
の中で使っている。
次に、入力画像のサンプリング位置を計算するのに、
実数から整数部を取得するみたいなのは、
N int — N
を使って、指定座標のRGB値を得るには、
Nx Ny getp1 — C
を使う。
最初の引数で渡した画像のRGBを取得する場合はgetp1
で、
2つ目の場合はgetp2
を使うことになる。
こんなことして何が面白いのか?って言われても、
個人的に面白くて仕方ないので、まだまだ続くと思う。
おしまい。
Leave a Comment