Windowsのペイントで1°単位の任意の角度で回転させる方法

ここではWindows 95/NT4.0以降のMicrosoft (R) ペイント(以下ペイント)で、1°単位の任意の角度で画像を回転処理させる方法について、その理屈をできるだけ分かりやすく説明してみたいと思います。

…と言っても整数ドット単位での移動ですから各ドットに多少の誤差が生じ、細部が多少乱れます。正直あまり綺麗な画像にはなりませんので、過度な期待は避けるべきものとご理解ください。

結果だけ知りたい方は「回転させる手順」をご覧ください。

目次


はじめに

ペイントの「伸縮」と「傾き」

「回転」と「傾き」の違い(1)

「回転」と「傾き」の違い(2)

回転させる手順

逆の手順でもよい

(次ページ)問題点とテクニック


はじめに

レトロPCを活用する用途として、OS標準付属のペイントでお絵描きすることもあるかと思います。一方で、2024年にはペイントの後継ソフトとされた「ペイント3D」が廃止され、最新PCにおいても標準付属のドローソフトとしては従来型のペイントを活用せざるをえなくなりました。

しかし従来型のペイントには、選択範囲または画像全体を1°単位で「傾ける」機能はあっても「回転する」機能は90°単位でしかできません。しかし「伸縮と傾き(サイズ変更と傾き)」で縦横それぞれの傾きと、縦横それぞれの伸縮(サイズ変更)を組み合わせれば1°単位の回転に相当する変換を行えることは、少し(?)考えてみると分かると思います。

ペイントのバージョンについて

本稿は主にWindows 2000のペイントをベースに構成しましたが、バージョンによって用語や操作方法に細かい差異がありうることは、あらかじめご了承ください。

例えばWindows 3.x/NT3.xに付属の「ペイントブラシ」の場合は伸縮は「縮小と拡大」と表記されており、「傾ける」などと共に「変形」メニューの下のあります。傾ける機能は水平方向しかなく、90°単位で回転させる機能もありませんので、その機能を持つGVなど多少のフリーソフトを併用する必要がありそうです。また角度や伸縮率が数字で指定できず、マウスのドラッグ移動で行う点が異なります。

Vista / Server2008以降では「伸縮」の呼び方が「サイズ変更」に変わっていますので、適宜読み替えてください。「傾き」も「サイズ変更」に付随する形で引き続き設定できます。


ペイントの「伸縮」と「傾き」

Windowsのペイントにある「伸縮と傾き(サイズ変更と傾き)」は、以下の4種類の変換を行うことができます。

なおWindows 8.1 /10 などのペイントでは「縦横比を維持する」のチェックボックスがあり、これをオフにすれば水平方向と垂直方向のサイズ変更が個別に指定できるようになります。


言葉で「傾ける」と言いますと、棒を倒すようなイメージで回転のようなものを連想するかもしれません。しかしペイントの「傾き」は、重ねた板を平行にずらしていくようなイメージになり、垂直(縦)方向への傾きであれば、水平(横)方向への変化は全く行いません。逆もまた然りです。




したがって、これらを組み合わせて回転相当に変換できる前提ならば、

・回転後のX座標は「水平方向の傾き」と「水平方向の伸縮(サイズ変更)」だけで変換できる。

・回転後のY座標は「垂直方向の傾き」と「垂直方向の伸縮(サイズ変更)」だけで変換できる。

…ということが言えると思います。

ただし「傾き」に関しては、座標軸から離れれば離れるほど移動量が大きくなるという関係がありますから、縦横両方の座標が全く無関係というわけではありません。この影響を避けるには、縦横どちらかの変換を先に済ませてから残りの方向を変換するようにすると良いでしょう。

「回転」と「傾き」の違い(1)


ここではまず一例として「垂直方向」への「傾き」から見ていきましょう。



「回転」と「傾き」の違いを図で示すと以下のようになります。



垂直に傾けた位置は、同じ角度(以下θ、単位は「°(degree)」です)で回転した位置と比べて、その延長線上にあることが分かります。では、どれくらい離れた位置に来るのでしょうか?

図を見ると直角三角形ですから、斜辺の長さに対して高さは正弦、底辺は余弦という定義になります。そして回転半径は底辺と同じ長さですから、「回転した位置」は「傾けた位置」よりも cosθ 倍だけ短いのです。

今回はまず縦方向に傾けたのですから、Y座標を回転後と同じ座標に変換しておくことが目的です。長さが cosθ 倍ですから、その垂直方向のベクトル成分も cosθ 倍のはずです。



便宜上X軸とかY軸という概念を使っていきますが、実際には画像全体が同じように変換されるという相対的な位置関係ですので、原点の位置も相対的なものとして、どこでも原点と見なすことができます(以降も同様)。
地球から見れば太陽のほうが地球のまわりを回っているように見えるのと同じです。

特定の座標点だけ見ていても全体のイメージが付かないと思いますので、ここまでの画像全体の変換を見てみましょう。座標をイメージするための正方形の4×4マス分の格子について、回転後の目標位置を青い点線で示します。



変換後の格子の交点について、回転後の目標位置(青い点線の交点)とを赤い点線で結んでみました。どの赤線もすべて水平に伸びています。つまり、あとは横方向の変換をするだけでよいことが分かります。

余談1

ところで「傾き」が「回転」を伸ばした位置に来るなら、画像全体を cosθ 倍に縮小すれば回転になるのではないかと思われたかもしれません。しかし横方向に傾けることをまだ考慮していないのですから、この時点でX座標を合わせる意味はありません。実際「傾き」は正方形を平行四辺形にするような変換ですから、ただ縮小しても平行四辺形のままです。上図で中央の図を見ますと、縮小しただけで回転位置に来そうなのは、回転前のX軸上にある直線だけの話だったことが分かります。結局のところ回転相当に変換するには横方向の操作も必要で、また特定の座標だけでなく全体像を意識する必要もありそうです。



「回転」と「傾き」の違い(2)

ここからは、Y座標が変換済みであることを前提にしたX座標の水平移動の話になります。
まず「水平方向の傾き」と「回転」の違いについて考えてみます。



「傾き」の場合はその軸(水平方向の場合はX軸)方向の格子間隔が変わりません。しかし回転であれば、軸方向の格子間隔が広がることが分かります。つまり、ただ傾けただけでは回転にならず、横方向にも伸長する必要があるのです。では、どれくらい広げればよいのでしょうか?

これは最初の垂直方向に傾けた図をベースに、縦の格子線が回転後にどの位置に来るか、線を引けば分かりやすいでしょう。



最初に縦方向の傾きで示した直角三角形とまったく合同な直角三角形が出現していることが分かります。新たな三角形の底辺は、当初の直角三角形の斜辺と同じ長さです。斜辺と底辺(=X座標)の関係はcosθ 倍でしたから、今度は逆にX座標を 1/cosθ 倍に伸ばせばよいのです。

そして当然ですが、縦の格子線ですので傾ける角度は(マイナス方向に)θ ということになります。



この結果、目標とする回転後の座標に到達しました。これで回転相当の変換になるはずです。

後半についても全体像を見てみましょう。X軸を赤い点線で示しました。小さくてちょっと見づらいですが、水平方向に伸長することでX軸上の交点が変換後(青い点線)と同じ位置に来ていることが確認できると思います。



回転させる手順

ひとまず以上の手順に従いますと、Windowsのペイントで(選択範囲または画像全体を)回転させる手順は以下のようになります。θ はプラスで反時計回り、マイナスで時計回りになります。

(1)垂直方向にθ (°)傾ける。

(2)垂直方向に cosθ 倍に伸縮(サイズ変更)。

(3)水平方向に 1/cosθ 倍に伸縮(サイズ変更)。

(4)水平方向に-θ (°)傾ける。*

* Windows 95/NT4.0のペイントにはマイナス方向に傾ける機能はありませんから、一時的に画像を反転させることで対処してください。

(2)と(3)で縦横の伸縮(サイズ変更)が2回続くのですが、実際のところ、水平方向(X成分)の伸縮(サイズ変更)と垂直方向(Y成分)の伸縮(サイズ変更)はそれぞれ独立した変換であって、互いに影響を及ぼしません。どちらが先でも構いませんし、Windows 98/2000以降では同時に行うこともできます。

例えば「伸縮と傾き(サイズ変更と傾き)」の入力欄に水平・垂直の数値を同時に入力して実行してから[CTRL+C](アンドゥ)してみると分かるのですが、傾きは縦横それぞれが一回分の変換として取り消されるのに対し、伸縮(サイズ変更)の場合は縦横同時に取り消されますので、内部的にも縦横の「伸縮(サイズ変更)」は同時に処理されているようです。

ここでWindowsのペイントの「伸縮と傾き(サイズ変更と傾き)」の入力欄は、

「水平方向の伸縮(サイズ変更)」
「垂直方向の伸縮(サイズ変更)」
「水平方向の傾き」
「垂直方向の傾き」


…という順番に並んでいますので、まとめて入力した場合には「縦横一括で伸縮(サイズ変更)」→「水平方向の傾き」→「垂直方向の傾き」という順番で個別に処理されます。したがって、(2)(3)(4)の変換はまとめて一度に入力しても順番的には問題ありません。



最初の(1)の傾きだけは独立して行う必要はありますが、「伸縮と傾き(サイズ変更と傾き)」を4回も繰り返す必要はなく、二回行うだけで回転操作ができる形になります。
Windows 95/NT4.0のペイントでは垂直方向と水平方向を同時に伸縮させることはできませんが、伸縮と傾きは同時に入力することができます。

余談2

では「伸縮(サイズ変更)」の順番を変えることで4つの数値を一回で全部入力して済ますことはできないのかといえば、結論から言えばその場合は傾ける角度がθではなく、別の角度に変わってしまいます。もともと「θ (°)」と指定して傾けたところで、その後に別の変換を施せば、最初に傾けたはずの角度からずれてしまいますよね。したがって、「θ (°)」と明示する傾きは最後の一回しか意味を持たないはずです。最低でも傾きは縦と横の二回行う必要があるわけですから、本来であれば最初に傾ける角度はθではなく変換を見越した別の角度に設定しなければならなかったはずです。しかし図の座標点の動きを見れば分かりますように、「傾き」が最初と最後になるような順番で変換すれば、一時的に傾けた角度が変わっても、最終的には最初に傾けた角度の直線上に戻ってきますので、縦も横も同じ「θ」を指定して変換することができる利点があるのです(ペイントの「傾き」の仕様上、θの正負だけ異なります)。
そもそも4つの数値を同時に入力したところで、前述のように内部的な変換の回数は3回ですから、誤差の蓄積を減らすことはできないと思います。



逆の手順でもよい

なお今回は最初に垂直方向に傾けることから始めていますが、X軸とY軸を入れ替えても全く理屈が同じですから、水平方向に傾けることから始めて最後に垂直方向に傾けるという方法もあります。

…と言いますか、それぞれの手順を逆回しで実行すれば逆方向の回転に相当するのですから、考えてみれば当然ですよね。



この場合はθ はプラスで時計回り、マイナスで反時計回りになります。とは言え、Windows 98/2000以降なら角度は-89°から+89°まで指定できますから、θ にマイナスを指定することで時計回りか反時計回りかを選べることは同じです。

(1)水平方向にθ (°)傾ける。

(2・3)水平方向に cosθ 倍、かつ垂直方向に 1/cosθ 倍に伸縮(サイズ変更)。

(4)垂直方向に-θ (°)傾ける。*

* 例によってWindows 95/NT4.0の場合は画像を反転してから傾ければマイナス方向に傾けられます。
また前述のように(2)と(3)は逆でも構いません。というかWindows 98/2000以降では(2)と(3)が同時に行えます。

次ページで補足しますが、これらの手順の違いで誤差の出かたが変わる場合がありますから、両方の手順を使い分けられるようにしておくとよいです。


まとめると、

・「傾き」→「伸縮(サイズ変更)」→「傾き」という(最初と最後に傾ける)順番で、縦と横の傾きは角度をそれぞれ正負逆にする。

・最初に傾けた方向には後から縮め、最後に傾ける方向には事前に広げておく。

…と覚えておくと良いでしょう。縮めたり広げたりは余弦(コサイン)で乗除します。


ペイントで画像を回転させるための簡単な手順説明は以上です。
次ページでは実用上の補足事項をいくつか説明しておきます。

(次ページ)問題点とテクニック


by KAZZEZ
TOPへ