このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
近傍法について考えてみよう。
基本は間引きによる処理を拡張したものであるため、
単純間引きと同じ特徴をもつ。
単純間引きとの違いは、任意のサイズに変更が可能なことだ。
実は、近傍法は近傍補間法とも呼ばれ、
拡大に使用することもできるのである。
アルゴリズム自体は、拡大に適用することもできるが、
昨日書いたコードは、縮小にしか使えない。
なぜならば、元のデータをそのまま置き換えているからだ。
まずは、近傍法のアルゴリズムを写真で示す。
縮小後の座標から対応する縮小前の座標を求め、
その座標位置に最も近い画素の色を使用する。
では、昨日のコードを少し訂正してみよう。
# BMP 読み込み。
my $src = read_bmp;
# 画像の幅と高さを取得。
my $scx = @{$src->[0]};
my $scy = @$src;
# 新しい画像の幅と高さを決める。
my $dcx = 105;
my $dcy = 90;
# 新しい画像のデータを準備する。
my $dest = [ map { [ (0) x $dcx ] } 1 .. $dcy ];
# 近い位置のピクセルを
# 画素を左上に持ってくる。
for (my $dy = 0; $dy < $dcy; ++$dy) {
for (my $dx = 0; $dx < $dcx; ++$dx) {
no integer;
# 新しい座標に対応する元の座標を求める。
my $sx = int($dx / ($dcx - 1) * ($scx - 1) + 0.5);
my $sy = int($dy / ($dcy - 1) * ($scy - 1) + 0.5);
$dest->[$dy][$dx] = $src->[$sy][$sx];
}
}
# BMP を書き出す。
write_bmp($dest, 24);