このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。
補間できる対象は、画像のサイズ変更だけではない。
回転などもその代表例だ。
回転は縦横の座標の計算が絡むので、意外にややこしい。
回転には角度があるが、角度があるということは、
数学の三角関数の考え方が必要になってくるということだ。
例外的に 90 度単位の回転で、90、180、270 度に関しては、
縦と横の座標変換だけで簡単にできる。
それ以外の角度の場合は、端数が出るため補間が必要となる。
では、右方向に 90 度回転する場合でやってみよう。
基本的に、回転後のピクセル位置から
元のピクセル位置を計算できれば OK なのだ。
# BMP 読み込み。
my $src = read_bmp;
# 画像の幅と高さを取得。
my $scx = @{$src->[0]};
my $scy = @$src;
# 新しい画像の幅と高さを決める。
my $dcx = $scy;
my $dcy = $scx;
# 新しい画像のデータを準備する。
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 = $dy;
my $sy = $scy - 1 - $dx;
# 転送する。
$dest->[$dy][$dx] = $src->[$sy][$sx];
}
}
# BMP を書き出す。
write_bmp($dest, 24);