[Python] Exifの回転情報に合わせて画像を回転する [PIL]

写真の縦・横のように、画像のExifのOrientation情報によって
画像の縦・横が設定されている場合、ツールによっては正しく扱えなかったりするので
無理矢理Exif無しでも正しくなるように画像を回転して保存するやり方を調べてみました。

このExifでの表示。
たとえばPhotoShopやIfanVIewでは正しく見えるのに、Windowsデフォルトのビューだと
縦横がおかしく表示されてしまうパターンがあります。

ツールなんかで調べた中だと、ffmpegで画像をムービー化したいばあい等も
Exifで回転が入っている場合、おかしな感じでムービー化されてしまうようでした。

ということで、このExifを取っ払って、PILを使用して回転をします。

まずは、Exif情報の取得。

https://www.lifewithpython.com/2014/12/python-extract-exif-data-like-data-from-images.html

やり方は、こちらのサイトのコードを使用しました。

画像の向きのOrientationは、整数の1~8で指定することが出来ます。
それだけだと、扱いにくいので、どのぐらい回転するか + ミラー反転するかどうか
に置き換えるような関数を作ります。

一応全パターン作りましたが、Exifの設定でミラーリングとか
絶対使わない気がします。

最後に、Exif情報を取得して画像を回転をして保存します。

コードはこんな感じ。

画像のミラー反転は、 PILのImageOps.mirror(obj)
回転は、imgObj.rotate(回転,expand=True)とします。
expand=Trueにすると、元の全画像を見える状態で回転をしてくれるようになります。
Falseの場合、画像サイズは同じになるので、90度回転とかすると、上下が切れて、左右が空いてしまうことになります。

最後に、そのままだと、Exif情報が残ってしまうので、Exif情報を削除するために
新しくPILのImageを作成して、回転した結果をその新しいキャンバスに貼り付けて保存しています。

今回は、以前SHOTGUNに複数画像をアップする方法で、Exif入りだとおかしくなる問題がでたので
やり方をしらべてみたのですが、
コレをつかうと、撮影した写真をBlogに載せるときに
回転情報がおかしくなってるものなんかを直すのにも使えそうです。

PILとかOpenCVまわりはまだまだ出来ることが多そうなので
色々と試してみたいです。

One thought on “[Python] Exifの回転情報に合わせて画像を回転する [PIL]

コメントを残す

メールアドレスが公開されることはありません。

*