android三星等手机拍照自动旋转问题与解决

来源:互联网 发布:英语基础自学软件 编辑:程序博客网 时间:2024/04/28 05:34
    开发"上传图片或头像"的过程中,发现有时三星,索尼等手机在拍照后会自动旋转90度。现在解决方案如下:
分为两步(第0步不一定用得上,主要看1与2):

0.onActivityResult中的代码进行改进      1.根据路径读取图片的旋转的角度    2.按照这个角度来旋转。M_PersonalDataActivity.java
0.
将onActivityResult中的代码进行改进:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {    super.onActivityResult(requestCode, resultCode, data);
   Uri originalUri = null;   File file = null;   if (null != data && data.getData() != null) {       originalUri = data.getData();       file = getFileFromMediaUri(ac, originalUri);   }   Bitmap photoBmp = getBitmapFormUri(ac, Uri.fromFile(file));   int degree = getBitmapDegree(file.getAbsolutePath());   // 把图片旋转为正的方向   Bitmap newbitmap = rotateBitmapByDegree(photoBmp, degree);
}
//用到的方法如下:public static File getFileFromMediaUri(Context ac, Uri uri) {   if(uri.getScheme().toString().compareTo("content") == 0){      ContentResolver cr = ac.getContentResolver();      Cursor cursor = cr.query(uri, null, null, null, null);// 根据Uri从数据库中找      if (cursor != null) {         cursor.moveToFirst();         String filePath = cursor.getString(cursor.getColumnIndex("_data"));// 获取图片路径         cursor.close();         if (filePath != null) {            return new File(filePath);         }      }   }else if(uri.getScheme().toString().compareTo("file") == 0){      return new File(uri.toString().replace("file://",""));   }   return null;}
1.
/**
* 读取图片的旋转的角度
* @param path 图片绝对路径
* @return 图片的旋转角度
*/
public static int getBitmapDegree(String path) {
int degree = 0;
try {
// 从指定路径下读取图片,并获取其EXIF信息
ExifInterface exifInterface = new ExifInterface(path);
// 获取图片的旋转信息
int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
2.
/**
* 将图片按照某个角度进行旋转
* @param bm 需要旋转的图片
* @param degree 旋转角度
* @return 旋转后的图片
*/
public static Bitmap rotateBitmapByDegree(Bitmap bm, int degree) {
Bitmap returnBm = null;
// 根据旋转角度,生成旋转矩阵
Matrix matrix = new Matrix();
matrix.postRotate(degree);
try {
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
returnBm = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
} catch (OutOfMemoryError e) {
}
if (returnBm == null) {
returnBm = bm;
}
if (bm != returnBm) {
bm.recycle();
}
return returnBm;
}
2 0
原创粉丝点击