在Android中,我注意到当我用相机拍照并将其映射到ImageView时,在某些相机(例如我的物理手机)上,它旋转了90度(而在模拟器手机上我使用,它们没有旋转)。
我试过了:
//once you have the main bitmap
ExifInterface ei = null;
try {
ei = new ExifInterface(imageFilepath);
int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
bitmap = getRotatedBitmap(bitmap, orientation);
}
catch (IOException e) {
e.printStackTrace();
}
现在轮换代码:
public static Bitmap getRotatedBitmap(Bitmap bitmap, int orientation) {
Matrix matrix = new Matrix();
switch (orientation) {
case ExifInterface.ORIENTATION_NORMAL:
return bitmap;
case ExifInterface.ORIENTATION_FLIP_HORIZONTAL:
matrix.setScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_180:
matrix.setRotate(180);
break;
case ExifInterface.ORIENTATION_FLIP_VERTICAL:
matrix.setRotate(180);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_TRANSPOSE:
matrix.setRotate(90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_90:
matrix.setRotate(90);
break;
case ExifInterface.ORIENTATION_TRANSVERSE:
matrix.setRotate(-90);
matrix.postScale(-1, 1);
break;
case ExifInterface.ORIENTATION_ROTATE_270:
matrix.setRotate(-90);
break;
default:
return bitmap;
}
try {
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
bitmap.recycle();
return bmRotated;
}
catch (OutOfMemoryError e) {
return bitmap;
}
}
这是对的吗?或者它是非常低效的?有更聪明的方法吗?如果我将旋转代码应用于位图,然后将其保存回存储,现在它将被"错误地旋转"还是我必须把它旋转回来?我不知道所有这些都是公认的做法。
答案 0 :(得分:0)
这是对的吗?
我怀疑你实际上会在野外看到所有这些定位的可能性。旋转图像会占用大量的堆空间,因此有时希望此代码失败并显示OutOfMemoryError
。
有更聪明的方法吗?
如果你只想让图像在ImageView
中正确显示,请旋转ImageView
。
如果我将旋转代码应用于位图,然后将其保存回存储,那么现在它是否会#34;旋转错误"还是我必须把它旋转回来?
这是不可能回答的,因为只有你知道你是如何拯救它以及什么"错误的"在这种情况下意味着。恕我直言,如果您正在完成此过程,请将其旋转到ORIENTATION_NORMAL
状态,然后将其保存为没有EXIF标题或使用ORIENTATION_NORMAL
保存。