画像の回転

 画像の回転は、90度、180度、270度以外の回転は、回転後 画像品質が低下します。
回転後の座標が、端数となり、周囲の画素からの補正値となるためです。
回転を行った場合は、元のファイルに上書きせず、ファイル名を変えて保存をした方が良いでしょう。
実際には、回転後の各座標位置にたいする、元画像の座標から値を取り出し、座標値が整数とならない場合は、小数点以下の値で、周囲の座標から補正計算して回転後の座標の値を求めます。

画像の回転
 図形を回転する場合、まず最初に、回転後のデーターを入れる場所を用意します。
ビットマップデーターのまま回転をすると、各座標のピクセル値を取り出す事になり、計算に時間が掛かるので、元画像も、回転後の画像のデーターも配列を用意して、回転を行います。
回転後の用意すべき配列の大きさは、上図にある計算により行います。
カラーの場合は、三色分用意します。

回転前の座標
 回転の計算をする場合、元画像の座標から、回転後の座標を計算し、回転後の座標に値を書き込むと、回転後の座標は回転角90度、180度、270度以外は、整数とならないので、座標値をまるめて、書き込むことになりますが、その時必ず、回転後の図形の座標に書き込みされない座標が発生します。
それを、防止するため、回転後の座標点、X=0 ~ Wo  Y=0 ~ Ho 迄、全ての座標点について、計算しますが、元座標に対しての座標を計算し、小数点となった値は、線形補間法により値を求めます。
元画像配列

 上の図は、配列のデーターを表しています。
白丸が元画像の配列の位置、黒丸が回転後の座標から元画像の配列の位置を計算した位置になります。
位置の差、DX、DYを求め、その周囲の四箇所の値から、線形補間をして、回転後の座標の値を求めます。
回転後の値
 左図は、上図の一部分を取りだした場合です。
Xi,Xi+1,Yi、DXから、Topの位置の値を求め、次にXi,Yi+1,Xi+1,DXからBottom位置の値を求めます。
Top,Bottm,DYから求めるべき、X,Y座標の値を計算します。

 この補間計算をすると、回転後の値が、元画像から1列1行分少ないない画像になります、元々回転をしたのであるし、写真などは画総数が多いので問題ありませんが、とりあえず、1列1行拡張して元画像とします。
データー拡張
 配列の大きさを、元画像のビットマップに対して、1行1列分大きくして、一番外側の1列一行をコピーして仮のデーターとして使用します。


 GDI+を利用した図形の回転

 GDI+は、WINXP(SP3)以降で使用できるので、これを利用した図形の回転です。
USE 文に GDIPAPI, GDIPOBJ を追加すれば簡単に回転が利用出来ます。
GDI画像回転
 GDI+を利用して回転する場合は、TGPBitmapにソース画像を読み込み、TBitmapを出力先に指定して、回転後の頂点座標4箇所を指定して、回転画像を得ます。
回転時使用されるのは、左上、右上、左下の3点が使用され、右下の座標は無視されるようです。
座標の指定の仕方で、回転と同時に変倍も可能です。
Tbitmapでも、変倍は可能ですが回転は出来ません。
画像は、線形補間されるので、きれいな回転、変倍画像を得ることができます。
 GDI+には、図形の回転としてTGPMatrixによる方法もあります、インターネットで、GDI+、TGPMatrixで探してみて下さい。

     download Rotation.zip


画像処理一覧へ戻る

     最初に戻る