在 Samsung Galaxy 设备上选择图像旋转

Choosing Images on a Samsung Galaxy Device rotates

我正在开发一个 Android 项目,用户可以在其中上传图像作为个人资料图像。直到某个时候(最终是三星更新),一切都很好。从那时起,Samsung Galaxy 设备上的图像(可能也在其他设备上),但在我的 HTC One XL 上它工作正常,在我的 Lenovo Yoga Tablet 上和 Sony(不知道确切是哪个)上也能正常工作。但在 Galaxy 的 S6 和 S5 上,它会旋转图像。这个想法是,在 "normal" 视角中设置图像作为用户拍摄的图像。这意味着,它应该只需要一个正方形,但当然,它是直立的。对于三星设备,头部逆时针方向错了 90 度。该代码在其他设备上完美运行。有人有同样的问题吗?任何想法?这是一些代码

// After image taken
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    try {
        // data returned
        if (resultCode != FragmentActivity.RESULT_CANCELED) {
            if (requestCode == RESULT_LOAD_IMAGE && resultCode == getActivity().RESULT_OK){
                // Set profile image from gallery
                try {

                    Uri selectedImage = data.getData();
                    photo = MediaStore.Images.Media.getBitmap(getActivity().getContentResolver(), selectedImage);
                    photo = MainUtils.rotateBitmap(photo, data, getActivity());

                    photo = MainUtils.resizeBitmapIfNeeded(photo, 800, 800);

                    byte[] byteArray;
                    ByteArrayOutputStream stream = new ByteArrayOutputStream();
                    photo.compress(Bitmap.CompressFormat.JPEG, 90, stream);
                    byteArray = stream.toByteArray();

                    // Save image to parse as ParseFile and connect to the ParseUser (redacted)
            }

MainUtils 方法:

public static Bitmap resizeBitmapIfNeeded(Bitmap image, int maxWidth, int maxHeight) {
    if (maxHeight > 0 && maxWidth > 0) {

        int wid = image.getWidth();
        int hei = image.getHeight();

        MainUtils.log(" resizeBitmapIfNeeded, size is " + wid + " X " + hei);

        if (wid > maxWidth || hei > maxHeight) {
            int width = image.getWidth();
            int height = image.getHeight();
            float ratioBitmap = (float) width / (float) height;
            float ratioMax = (float) maxWidth / (float) maxHeight;

            int finalWidth = maxWidth;
            int finalHeight = maxHeight;
            if (ratioMax > 1) {
                finalWidth = (int) ((float) maxHeight * ratioBitmap);
            } else {
                finalHeight = (int) ((float) maxWidth / ratioBitmap);
            }
            image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);

            wid = image.getWidth();
            hei = image.getHeight();
            MainUtils.log(" resizeBitmapIfNeeded, resized size is " + wid + " X " + hei);
            return image;
        } else {
            return image;
        }
    } else {
        return image;
    }
}

public static Bitmap rotateBitmap(Bitmap bitmap, Intent data, Context context) {

    int orientation = 0;

    try {
        Uri selectedImage = data.getData();
        ExifInterface exif;
        exif = new ExifInterface(MainUtils.getRealPathFromUri(context, selectedImage));
        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                ExifInterface.ORIENTATION_UNDEFINED);

        MainUtils.log("Orientation is " + orientation);

    } catch (IOException excep) {
        MainUtils.log("Rotate " + excep.getMessage());
    }

    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.postRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.postRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.postRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.postRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.postRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.postRotate(-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) {
        e.printStackTrace();
        return null;
    }
}

public static Bitmap rotateBitmapFromFile(String picturePath) {

    int orientation = 0;
    Bitmap bitmap = BitmapFactory.decodeFile(picturePath);

    try {
        ExifInterface exif = new ExifInterface(picturePath);
        orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);

        MainUtils.log("Orientation is " + orientation);

    } catch (IOException excep) {
        MainUtils.log("Rotate " + excep.getMessage());
    }

    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.postRotate(180);
            break;
        case ExifInterface.ORIENTATION_FLIP_VERTICAL:
            matrix.postRotate(180);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_TRANSPOSE:
            matrix.postRotate(90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_90:
            matrix.postRotate(90);
            break;
        case ExifInterface.ORIENTATION_TRANSVERSE:
            matrix.postRotate(-90);
            matrix.postScale(-1, 1);
            break;
        case ExifInterface.ORIENTATION_ROTATE_270:
            matrix.postRotate(-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) {
        e.printStackTrace();
        return null;
    }
}

画廊意图

Intent intent = new Intent(
                        Intent.ACTION_PICK,
                        MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                intent.setType("image/*");
                startActivityForResult(
                        Intent.createChooser(intent, "Select File"),
                        galleryRequest);

重复问题,参见Android image selected from gallery Orientation is always 0 : Exif TAG

检查 MKJParekh 的答案。你必须做什么: 1.) 检索位图媒体存储的方向 2.) 必要时根据方向旋转位图