私が担当するシステムで、iPhoneで撮影した画像をアップロードしたら90度回転されて登録してしまった時の話です。
システムを修正するにはライブラリの追加が必要で、リリース作業はしたくなかったのでどう対応したのか、備忘録も含めて共有します。
1. 画像が回転して登録される
スマホで撮影した画像をスマホアプリからアップロードすると正常に登録されるんですが、Web画面からアップロードした時にだけ画像が回転する事象が発生しました。
ただ、常に発生するわけではなく、どうも特定のパターンがある様子。。
実機を使って色々調べました。
2. 原因は画像の向き
調べた結果、以下のことが確認できました。
- Android13 の端末では発生しない
- iPhoneの画像だと発生する
- jpeg画像で発生する
上の情報で調べたところ、どうもjpg画像には「Exif情報」なるものを持っているようで、この情報内にある「画像の向き」をアップロード時に判定しないといけないようです。
写真の撮影日時や撮影したカメラの情報、カメラの設定など、撮影した時の情報のこと。
スマホで撮影した画像は端末の角度も保持している為、縦画像や横画像か判別できる。
ちなみに、Web側の処理では画像の縦と横のサイズを取得・比較することで「縦長画像」か「横長画像」かを判定していました。
が、回転する画像については縦と横のサイズが逆に取得されており、横長画像として判定されてました。
※縦:3624px、横:2482px が 縦:2482px、横:3624px と判定されてました
3. 恒久対応
担当しているシステムはJavaで動いています。
画像からExif情報を取得して写真撮影時の端末の向きを取得する必要があり、Exif情報の取得にはライブラリの追加が必要でした。
ライブラリにはいくつか種類があるようで、ググったところ下記の2種類がメジャーのようです。
- Apache Commons Imaging
- Metadata Extractor
ただ、ライブラリの追加を伴うリリースは手間がかかるので、今は避けたい・・・
ということで、暫定的な回避策を調べました。
4. 暫定対応
ライブラリの追加を伴わない改修でなんとかならないか、画像をいじったら正常にアップロードできないか、という観点で調べたところ・・・
「画像をペイントで開き、上書き保存する」
これでいけました。
※画像を回転して保存する、Exif情報を消す、という方法も見つかりましたが、事象の改善には至りませんでした。
手順は下記です。
①回転してしまう画像を右クリック
②「プログラムから開く」でペイントを選択
③ペイントで画像が表示された後、そのまま上書き保存
④画像をアップロード
5. 終わりに
今回はライブラリの追加はなしで、という背景があったため、なんとか改善方法を見つけた感じです。
ただ、本来はライブラリを追加してリリースすべきなので、ライブラリの使い方を含め検証して、備忘録としてまたブログに記載したいと思います。