ブログBlog
カメラについての追加事項②
投稿日:2014年08月20日
布内です。
先日、カメラ機能で発覚した問題と対処方を紹介しました。
問題①
カメラで撮影後にActivityに戻るタイミングで端末の向き(縦横)を変えるとエラーが発生する。
問題②
縦向きに撮影した写真が横向きに保存される。
これの①だけしか書いてなかったので、②を説明します。
問題②
端末によって発生したりしなかったり(Android3以下で発生?)します。
原因ははっきりしませんが、スマートフォンのカメラは向きがあるらしく、大半のカメラは横向きに使用するように設定されているそうです。
画像を取得する時に、向きの情報が取得されず、横向きに表示されていると推測しています。
対処方は画像の向きを取得し、画像を保存時に回転させてから表示(保存)します。
uriを指定してカメラを呼び出し、bitmapに出力する部分は省略します。
String path = uri.getPath();
try{
ExifInterface exifInterface = new ExifInterface(path);
int orientation = getExifint(exifInterface,ExifInterface.TAG_ORIENTATION);
これで画像がどの向きに傾いてるのかを取得できます。
ちなみにorientationに入っている値は以下のようになります
1:ORIENTATION_NORMAL
通常
2:ORIENTATION_FLIP_HORIZONTAL
左右反転
3:ORIENTATION_ROTATE_180
180度回転
4:ORIENTATION_FLIP_VERTICAL
上下反転
5:ORIENTATION_TRANSPOSE
270度回転+上下反転
6:ORIENTATION_ROTATE_90
90度回転
7:ORIENTATION_TRANSVERSE
90度回転+90度反転
8:ORIENTATION_ROTATE_270
270度回転
orientationに合わせてR(角度)に値を入れます。
int R = 0;
switch(orientation){
case 1:
R=0;
barek;
case 6:
R=90;
break;
case 3;
R=180;
break;
case 8;
R=270;
break;
}
取得した角度に画像を回転させます。
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postRotate(R);
Bitmap image = Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
createBitmapの引数のintXとintYは0が入ります
Matrixクラスは画像を回転、縮小拡大等ができるクラスです。
postRotateは図のように回転します。
画像を再描画します。
invalidate();
これで画像の傾きを取得し、それに合わせて画像を傾けて表示することができます。