2006 年 3 月 5 日 23 時 30 分

画像の回転


このアーカイブは同期化されません。 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);



Copyright (c) 1994-2007 Project Loafer. All rights reserved.