エンジニアリング

へたれエンジニアが写真のトリミング機能を実装している中で、Androidのギャラリーなどについてもろもろ悩んだ話

どうもへたれエンジニアです。 ちょっと前にAndroidで写真のトリミング機能実装をしていた時に写真の向きで悩んだのでそのTipsになります

写真の向き変じゃね?

この画像を見て欲しいです↓

スクリーンショット 2017-12-02 15.07.14

こんな感じで縦で写真を撮影した画像に対して画像編集で切り抜きを行う場合縦で撮影した時の上部が写真の上部として設定してほしいですよね。↓

スクリーンショット 2017-12-02 15.07.19

しかしそのまんまギャラリーに渡すとこんな感じになってしまいます↓

スクリーンショット 2017-12-02 15.07.24

「なんでやねーーーーーーーーーーーん」

iOSだと同じような実装をしていたとしても期待しているように画像が表示される・・・なんでだろう・・・と悩んでグルぐりました

画像の向きを写真が持っている!!

どうやら調べてみると写真に含まれるEXIF情報の中に向きにまつわるOrientationという情報を読み取って画像向きを処理していないことが原因のよう

参考:iPhoneからアップロードしたJPEG写真が横向きになる問題(EXIF, Orientation)

Android Developerを見てみてもEXIFを扱うクラスが提供されていることを確認!

参考:ExifInterface – Android Developers

という事でこんな感じでコードをいじってみました※一部抜粋

[java]
Bitmap rotatedBitmap = selectedImage;
String imagePath;
ExifInterface ei = new ExifInterface(imagePath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_UNDEFINED); //ここでどこが上かの判断

switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
rotatedBitmap = rotateImage(selectedImage, 90); //回転させる
break;
case ExifInterface.ORIENTATION_ROTATE_180:
rotatedBitmap = rotateImage(selectedImage, 180);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
rotatedBitmap = rotateImage(selectedImage, 270);
break;
case ExifInterface.ORIENTATION_NORMAL:
default:
rotatedBitmap = selectedImage;
}

[/java]

これで良い感じに画像が上向きに認識できるようになりました!

最後に・・・・・

Androidは機種によってこのorientationを参照して自動的にギャラリーアプリで上を認識させたり、させなかったりするので惑わされますね・・・・・