On some Android phones (such as MT788, Note2), photos taken with camera will be automatically rotated (90°, 180°, 270°), which is not expected. After careful analysis, because the photo attribute is stored in the rotation information, so to solve this problem, you can in the Onactivityresult method, get the photo data, read its rotation information, if not 0, indicating that the picture has been rotated, Then use Android.graphics.Matrix to rotate the photos back.
1, read the picture rotation properties
/**
* 读取图片的旋转的角度
*
* @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
;
}
}
catch
(IOException e) {
e.printStackTrace();
}
return
degree;
}
|
2. Rotate the picture according to an angle
/**
* 将图片按照某个角度进行旋转
*
* @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;
}
|
OK, with the above two methods, it can be done!
Some Android phone photos are rotated after photo-solution