Androidのcamera2 apiで撮影した画像が回転してしまうのを戻す方法

Androidアプリ開発でcamera2 apiを使用し静止画撮影機能を実装しました。
googleのサンプルであるgooglesamples / android-Camera2Basicを参考にしました。

その中問題が1点出てきました。
端末によって画像が90℃回転して保存されるという問題です。

今回はその問題の正体と解決方法についてまとめます。

問題の正体

端末によって問題が発生するので端末依存の問題だと思っていましたが、
調べたところAndroidのバージョン依存でした。

下記はgoogleのサンプル中のコード(Camera2BasicFragment ::captureStillPicture)ですが
カメラで静止画をキャプチャーするときは

のようにCaptureRequest.JPEG_ORIENTATIONに回転角をセットします。

カメラの角度は横向きが基本になっているものが多く、
ここで現在の端末の回転角を適用してあげることで回転が補正されるという作りになっています。

 

一方でAndroidのバージョンが10以上ではこの

が効かない。
そのためカメラのデフォルトの角度で保存されてしまうという状態でした。

解決策

カメラに対して回転させて保存する指示が出せないので、
カメラが保存してきたものを回転させてしまおうという考えに至りました。

googleのサンプルでは画像保存用のクラスとしてImageSaverというクラスを実装しています。(下記)

見たままですが保存する際にはこのクラスでImageがFileに書き込まれます。

このクラスにrotationを引き回して回転させるように変更します。(下記)

上記のimageRotation : Intは先ほどのcaptureBuilderにパラメータをセットしているところの値を使用します。
これを適用することで画像の回転を戻すことができます。
問題点が1つ、キャプチャーしてから回転させているためどうしても保存処理が少し遅くなってしまいますので注意してください。

 

参考

https://stackoverflow.com/questions/60298127/issue-with-image-orientation-when-capturing-using-camera2-api-in-android-version

https://medium.com/@kenodoggy/solving-image-rotation-on-android-using-camera2-api-7b3ed3518ab6


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です