C/C++ での画像のスケーリングと回転

画像の拡大縮小と回転には多くの方法があります。スケーリングする最も簡単な方法は次のとおりです。

dest[dx,dy] = src[dx*src_width/dest_width,dy*src_height/dest_height]

ただし、これにより、サイズを大きくするとブロック状の効果が生じ、サイズを小さくすると詳細が失われます。バイリニア フィルタリングなど、見栄えの良い結果を生成する方法があります。

回転の場合、回転行列を使用して src ピクセル位置を計算できます:

sx,sy = M(dx,dy)

ここで、M は宛先ピクセルをソース イメージにマップする行列です。繰り返しになりますが、ブロックのない結果を生成するには、補間を行う必要があります。

ただし、画像処理の数学に触れたくない場合は、利用可能なライブラリがたくさんあります。


あなたがしているのは、一連の入力ポイントを一連の出力ポイントにマッピングすることです。問題の最初の部分は、サイズ変更または回転のマッピングを決定することです。 2 番目の部分は、正確にピクセル境界上にない点を処理することです。

サイズ変更のマッピングは簡単です:

x' = x * (width' / width)
y' = y * (height' / height)

回転のマッピングは少し難しいだけです。

x' = x * cos(a) + y * sin(a)
y' = y * cos(a) - x * sin(a)

グリッドから外れているピクセルの値を決定する手法は、補間と呼ばれます。このようなアルゴリズムは数多くあり、速度と最終的な画質はさまざまです。それらのいくつかは、品質/時間の昇順で最近傍、双一次、双三次、および Sinc フィルターです。


これを実現する簡単な方法はありません。スケーリングも回転も簡単なプロセスではありません。

したがって、2D イメージング ライブラリを使用することをお勧めします。マジック ++ は、divideandconquer.se が指摘するようにアイデアになる可能性がありますが、他にもあります。