正确的方式来旋转Android图像?

时间:2017-01-24 11:50:31

标签: android bitmap rotation imageview

在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;
    }
}

这是对的吗?或者它是非常低效的?有更聪明的方法吗?如果我将旋转代码应用于位图,然后将其保存回存储,现在它将被"错误地旋转"还是我必须把它旋转回来?我不知道所有这些都是公认的做法。

1 个答案:

答案 0 :(得分:0)

  

这是对的吗?

我怀疑你实际上会在野外看到所有这些定位的可能性。旋转图像会占用大量的堆空间,因此有时希望此代码失败并显示OutOfMemoryError

  

有更聪明的方法吗?

如果你只想让图像在ImageView中正确显示,请旋转ImageView

  

如果我将旋转代码应用于位图,然后将其保存回存储,那么现在它是否会#34;旋转错误"还是我必须把它旋转回来?

这是不可能回答的,因为只有你知道你是如何拯救它以及什么"错误的"在这种情况下意味着。恕我直言,如果您正在完成此过程,请将其旋转到ORIENTATION_NORMAL状态,然后将其保存为没有EXIF标题或使用ORIENTATION_NORMAL保存。