Lightroom Classic(以下Lr)には写真が傾いていても角度を自動補正する機能があります。
今回はそれを使わず、EXIFを参照して一括で垂直を出したい!という内容。
しかし…
検索で来た人が長々とこのブログを読んでがっかりすることのない様、最初に結論を書きますと、このプロジェクトは失敗というか未完というか、一括して角度自動補正をかけることはできませんでした!
できました!↓
Lrのこの機能は一見便利に思えますが、どんなアルゴリズムで補正値を出しているのかよくわからず、時々大外れな補正をしてくれちゃいます。
それだけならまだ便利に使えるのですが、このツール、写真一枚一枚に個別にかけるしか出来ません。たくさんある場合でも、選択して一括で自動補正することができないのです。
最近のカメラにはEXIFにカメラの傾きを記録している物もあるので、そのEXIF情報を元にLrのxmpファイルを書き換えて反映させたら出来るのではないかとコードを書いていたのですが…角度補正をすると当たり前ですがトリミングされますよね?
そのトリミングが最小限になる比率を測っているのでしょうか?その比率が元画像の比率ではなく、「カスタム」としてよくわからない比率にされちゃいます。
そこで、Lr上で複数選択後、自動同期で角度を自動補正しようとしても、個々に自動補正をかけるわけでもなく、最初に選択した写真の角度がそのまま同期されるだけで…使えない。
上手くできたらプラグインにして簡単に補正できる様にしたいと思っていたのですが、プラグインにしても多分この仕様は同じかと思い、ドキュメントも見ていません。
もったいないので今回分かった事だけまとめようと思います。
xmpに記述されるクロップとその角度は以下の様な関係になっていて、0〜1の範囲でエッジからの距離が記述されます。
ピッタリついている状態(トリミングなし)が1です。
肝心の角度はcrs:CropAngleに記載され、crs:CropAngle="-1.14"の様に小数点以下2桁で記述されます。
Camera Raw namespace
https://developer.adobe.com/xmp/docs/XMPNamespaces/crs/
EXIFはExifToolを使用し、カメラにセンサーがあれば Roll Angle というタグに左右の傾きが記述されています。
これとは別にPitch Angle(前傾後傾)やYaw Angle(振り?)がありますが、写真の傾きに使うのはRollだけです。そしてYawは基準がよくわからないです…。
これらの他に、カメラの横構図、縦構図を記述する Orientation というタグもあり、鏡像含め0から8までの数値で表されますが、わかりにくいので他の書き方で簡単に書くと、ニコンの場合 Orientation:Horizontal (normal) で横構図。Rotate 90 CW でシャッターボタン上の縦構図。Rotate 270 CW でシャッターボタン下の縦構図となります。
この情報はたくさんありますので、詳しく知りたい方は調べて見てください。
EXIFから傾きを取得→Roll Angleに割り当てまではできたのですが、それだけだとLr側でトリミングしてしまうので、各Crop〜にも数値を入れて、元画像のアスペクト比を維持しなければなりません。
これがなかなか複雑で、いまいちよくわからない挙動をするので諦めました。
残念な結果になってしまいましたが、Adobeさんには是非一括自動角度補正を実装してもらいたいです。
できればoption押しなどでEXIFのデータを参照にした自動補正など含めて…。
以下は全コードではないですが、PythonでのExifTool→補正数値計算までのコードです。
環境依存の部分もあるので丸々コピペとはいきませんが、参考になりましたら…と言っても作ったのGPTさんですが。
コードを表示