2014年10月4日土曜日

androidアプリ開発テクニックまとめ 画像編その2

前回のandroidアプリ開発テクニックまとめ 画像編その1の続きです。 今回は画像の回転処理についてまとめます。

環境

  • android:minSdkVersion="14"
  • android:targetSdkVersion="19"

画像処理 画像回転対策

androidは端末ごとにデフォルトのカメラが搭載されていますが、残念ながら画像を同じ向きで撮影しません。 例えば、Galaxy系はデフォルトが横ですが、nuxus系は縦になります(機種依存です。)

なので、アプリで全ての端末で画像を同じ向きで表示したい場合には画像の向きを取得する必要があります。 この画像の向きを取得するのにandroidではExifInterfaceというクラスを使います。

このクラスはクラス名の通り、Exif(イグジフと読みます)のタグを取得することができます。 Exif「イグジフ」は、画像に埋め込まれたカメラの機種や撮影時の条件を埋め込んでいるメタデータのことです。

では、以下にコードを記載します。


 /**
  * 画像の回転度を取得
  * @param filePath
  * @return
  */
 public static int getRotateDegree(Context context, Uri uri) {
  int degree = 0;
  try {
   ExifInterface exifInterface = new ExifInterface(getPath(context, uri));
   int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
   if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
    degree = 90;
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
    degree = 180;
   } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
    degree = 270;
   }
  } catch (IOException e) {
   degree = -1;
   e.printStackTrace();
  }

  return degree;
 }

 /**
  * 画像ファイルのパスを取得する
  * @param context
  * @param uri
  * @return
  */
 public static String getPath(Context context, Uri uri) {
  if(uri == null)
   return null;

  if(uri.getScheme().equals("file"))
   return uri.getPath();

  ContentResolver contentResolver = context.getContentResolver();
  String[] columns = { MediaStore.Images.Media.DATA };
  Cursor cursor = contentResolver.query(uri, columns, null, null, null);
  cursor.moveToFirst();
  String path = cursor.getString(0);
  cursor.close();
  return path;
 }

上記のようにすることで画像の向きを取得することが可能です。 上記のgetRotateDegreeメソッドで返り値が90, 180, 270の場合は、画像が返り値の度数だけ回転していることを示します。

画像を回転させるにはMatrixクラスを使います。


 /**
  * 画像が回転している場合は、適切に表示できるようなMatrixオブジェクトを返します。
  * 画像の回転が必要ない場合はnullを返す。
  * @param orientation 回転度数
  * @param width1      幅
  * @param height      高さ
  * @return
  */
 public static Matrix getMatrix(int orientation, int width, int height ) {

  Matrix matrix = new Matrix();
  if (orientation == 90) {
   matrix.postTranslate(-width/2,-height/2);
   matrix.postRotate(90f);
   matrix.postTranslate(width/2,height/2);
  } else if (orientation == 180) {
   matrix.postTranslate(-width/2,-height/2);
   matrix.postRotate(180f);
   matrix.postTranslate(width/2,height/2);
  } else if (orientation == 270) {
   matrix.postTranslate(-width/2,-height/2);
   matrix.postRotate(-90f);
   matrix.postTranslate(width/2,height/2);
  } else {
   return null;
  }

  return matrix;
 }

postRotateメソッドで回転度数を設定し、postTranslateメソッドで移動距離を設定しています。
移動→回転→移動と、画像を動かしています。

頭の中だけでイメージしにくい人は、紙に書き出して確かめるか、細かくデバッグして一つ一つのメソッドの動きを確かめてみましょう。 回転をさせる時に中心点をずらしているのがわかると思います。

また、Matrixは画像の拡大や縮小でも利用可能です。Bitmapのdecodeを使う場合がほとんどだと思いますが、Matrixと使い分けると便利です。

この記事がお役にたちましたらシェアをお願いします

このエントリーをはてなブックマークに追加

0 件のコメント:

コメントを投稿

Related Posts Plugin for WordPress, Blogger...