Javaで画像ファイルを回転させる

posted in: Java | 0

こんにちは。阿部です。

Linuxには画像ファイルを回転させるconvertコマンドがありますが、
Windowsには、そのようなコマンドがなさそうだったので、Javaで簡単なツールを作ることになりました。

ちょっと調べたところ、画像の回転はjava.awt.geom.AffineTransformを使えばできそうです。
ファイルの読み書きを除けば実質4行です。

よし、できた!サンプルとしてデーコムラボのロゴを回転してみましょう。

画像がずれてしまう

回転するにはしたのですが……。

失敗作1

どうやら回転の原点が左上になってるみたいですね。
画像がずれてしまいます。

AffineTransformには、画像を平行移動するメソッドもあるので、これを使いましょう。
回転で位置がずれてしまった画像を、真ん中に引き戻します。

回転後の画像の中心座標はx = (width * cosθ - height * sinθ) / 2y = (width * sinθ + height * cosθ) / 2
で求められます。

画像が欠けてしまう

その場で回転しましたが…

失敗作2

保存する画像のサイズ(幅、高さ)が元のままなので、はみ出した部分が欠けてしまいました。
回転した画像がぴったり収まるように幅と高さを指定してやる必要があります。
この計算を考えるのが一番大変でした。

元の画像の対角線が、回転後の画像の上下もしくは左右の辺に接していることを利用して計算しました。もっとスマートなやりかたがあるのかもしれませんが、私の頭では思いつかなかったので、そのままのコードを載せます。

完成

最初の4行に比べると、ずいぶん長くなってしまいましたが、完成です。

思っていた通りの画像が得られました。

欲しかった画像

まさか、実業務でサイン、コサインを使う日が訪れようとは思いもしませんでした。

LINEで送る
Pocket