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

本文介绍了一种解决三星、索尼等手机拍照后自动旋转90度的问题的方法。通过读取图片的EXIF信息判断旋转角度,并使用Bitmap旋转功能进行修正。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    开发"上传图片或头像"的过程中,发现有时三星,索尼等手机在拍照后会自动旋转90度。现在解决方案如下:
分为两步( 第0步不一定用得上,主要看1与2):

0 .onActivityResult中的代码进行改进       1.根据路径 读取图片的旋转的角度    2.按照这个角度来旋转。 M_PersonalDataActivity.java
0.
将onActivityResult中的代码进行改进:
@Override
protected 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值