前回Androidでカメラとギャラリーから画像を得るの続きです。
今回ちょっとめんどくさかったのはスマホによっては画像が曲がってはられてしまうということです。
Pathを利用して画像の情報を取得して正しい向きで画像を貼ろうと思います。
前回は画像のURIとPathが得らることができました。
画像には様々な情報(EXIF)があります。
その一つに画像の「向き」があります。
これを考慮せずに、Bitmapファイルに突っ込むとそのままの向きで定義初期化されてしまいます。
そこで、
Pathを使って画像の情報を取得
↓
画像をmatrixを使って回転
↓
貼る
という流れです。
// orientationを考慮して、matrixを形成 int orientation = 0; try{ ExifInterface ei = new ExifInterface(path); orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,1); }catch (Exception e){ e.printStackTrace(); } // デコード時のオプション(変更する人) BitmapFactory.Options = options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; // optionをいじる人はここで(詳しくは、下記にある参考の一番上のサイトで) options.InJustdecodeBounds = false; Bitmap bmp_ori = BitmapFactory.decodeFile(path, options); Matrix matrix = getMatrixFromOrientation(orientation, bmp_ori.getWidth(), bmp_ori.getHeight()); Bitmap bmp_new = Bitmap.createBitmap(bmp_ori, 0, 0, bmp_ori.getWidth(), bmp_ori.getHeight(), martix, true); ImageView.setImageBitmap(bmp_new);
以下はgetMatrixFromOrientation関数です。
private Matrix getMatrixFromOrientation(int orientation, int wOrg, int hOrg){ Matrix mat = new Matrix(); mat.reset(); switch(orientation) { case 1://only scaling mat.preScale(1, 1); break; case 2://flip horizontal mat.postScale(-1, 1); mat.postTranslate(wOrg, 0); break; case 3://rotate 180 mat.postRotate(180, wOrg/2f, hOrg/2f); mat.postScale(1, 1); break; case 4://flip vertical mat.postScale(1, -1); mat.postTranslate(0, hOrg*factor); break; case 5://flip vertical rotate270 mat.postRotate(270, 0, 0); mat.postScale(1, -1); break; case 6://rotate 90 mat.postRotate(90, 0, 0); mat.postScale(1, 1); mat.postTranslate(hOrg, 0); break; case 7://flip vertical, rotate 90 mat.postRotate(90, 0, 0); mat.postScale(1, -1); mat.postTranslate(hOrg, wOrg); break; case 8://rotate 270 mat.postRotate(270, 0, 0); mat.postScale(1, 1); mat.postTranslate(0, wOrg); break; } return mat; }
コードも特に解説するような場所はないと思います。
参考にしたサイト
https://corgi-lab.com/android/show-image/
https://blog.livedoor.jp/esper776/archives/65818185.html
https://developer.android.com/reference/android/media/ExifInterface.html?hl=ja#ORIENTATION_NORMAL