2006 年 2 月 23 日 23 時 56 分

単純間引きによる画像の縮小


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


[写真] [写真] [写真]


今日からは趣向を変えて、拡大縮小をやることにしよう。

画像を縮小する場合、元のサイズよりも小さくするため、
ピクセル数が少なくなり、情報量が低下する。
そのため、ピクセルの取捨選択をする必要がある。

今日は単純に、間引きによる縮小をしてみよう。
元の画像から 2 ピクセル間隔で抜き出せば、
データ量を半分にすることができる。
これを縦と横に適用すれば、1/4 サイズの画像が得られる。

ではやってみよう。


# BMP 読み込み。
my $data = read_bmp;

# 新しい画像の高さと幅を取得。
my $height = @$data / 2;
my $width = @{$data->[0]} / 2;

# 2 ピクセル間隔で間引き、
# 画素を左上に持ってくる。
for (my $yy = 0; $yy < $height; ++$yy) {
    for (my $xx = 0; $xx < $width; ++$xx) {
        $data->[$yy][$xx] = $data->[$yy * 2][$xx * 2];
    }
}

# データの幅と高さを調整する。
$#$data = $height - 1;
$#$_ = $width - 1 foreach @$data;

# BMP を書き出す。
write_bmp($data, 24);


処理が単純なだけに、コードも非常に短くなった。

長く使っているサンプルデータは写真画像なので、
この手法で縮小してもそれほど違和感はないが、
参考に示した、ガンマ値のグラフ画像は、
主要なピクセルが抜け落ちたため、見づらい結果となった。



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