最近在做项目的自定义相册时,遇到了这么一个问题:从 小米9 手机上面的拉起系统相机进行拍照,然后上传到服务器上面,发现图片莫名其妙就旋转了 90° ,这个并不符合业务方的需求,在仔细分析后,发现拍照后,系统保存到本地的照片已经给旋转过了
因此要解决这个问题,就只有在拍照后,判断图片是否给旋转,如果有,就将它旋转回去
要获取图片的旋转信息,就需要获取图片的 Exit 信息,它里面存储了图片的全部参数,我们可以通过 ExifInterface 来获取到这个数据:
/**
* 读取图片的旋转的角度
*
* @param path 图片路径
*
* @return 图片的旋转角度
*/
private 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;
default:
break;
}
} catch (IOException ignore) {
}
return degree;
}
如果 degree 不为 0 ,那么就说明 图片已经给旋转了,那么就需要我们去旋转回去:
/**
* @param filePath 文件存储路径
* @param degree 旋转角度
* @param savePath 文件保管路径
*/
private void rotateBitmapByDegree(String filePath, int degree, String savePath) {
try {
Matrix matrix = new Matrix();
// 根据旋转角度,生成旋转矩阵
matrix.postRotate(degree);
Bitmap bm = BitmapFactory.decodeFile(filePath);
// 将原始图片按照旋转矩阵进行旋转,并得到新的图片
final Bitmap bitmap = Bitmap.createBitmap(bm, 0, 0, bm.getWidth(), bm.getHeight(), matrix, true);
//将新的图片保管到本地
bitmap.compress(CompressFormat.JPEG, 85, new FileOutputStream(savePath));
} catch (FileNotFoundException ignore) {
}
}