ブログ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();

これで画像の傾きを取得し、それに合わせて画像を傾けて表示することができます。

PAGE TOP