Изображение захвачено или выбрано из библиотеки изображений, повернутое на 90 градусов

Я реализовал функционал захвата/выбора изображения, и он прекрасно работает на HTC, однако на Samsung Galaxy Note 4 (версия Android 5.1.1) он поворачивает изображение на 90 градусов. Вот 2 варианта кода, но все еще повернутые:

ВАРИАНТ 1:

public void captureImageCameraOrGallery() {

        Intent galleryintent = new Intent(Intent.ACTION_GET_CONTENT, null);
        galleryintent.setType("image/*");

        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

        Intent chooser = new Intent(Intent.ACTION_CHOOSER);
        chooser.putExtra(Intent.EXTRA_INTENT, galleryintent);
        chooser.putExtra(Intent.EXTRA_TITLE, "Select from:");

        Intent[] intentArray = { cameraIntent };
        chooser.putExtra(Intent.EXTRA_INITIAL_INTENTS, intentArray);
        startActivityForResult(chooser, REQUEST_PIC);
}
   public void onActivityResult(int requestCode, int resultCode, Intent data) {

            if (requestCode == REQUEST_PIC && resultCode == RESULT_OK) {
                Uri selectedImageUri = data.getData();
                Bitmap bmp = null;
                try {
                    if (selectedImageUri != null) {
                        bmp = getBitmapFromUri(selectedImageUri);
                    }

                    if (bmp == null) {
                     return;
                    }

                    ExifInterface ei = new ExifInterface(selectedImageUri.getPath());
                    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_NORMAL);

                    Log.e("Capture orientation: ", String.valueOf(orientation));
                    int rotateAngle = 0;
                    switch(orientation) {

                        case ExifInterface.ORIENTATION_ROTATE_90:
                        rotateAngle = 90;
                        break;

                        case ExifInterface.ORIENTATION_ROTATE_180:
                        rotateAngle = 180;
                        break;

                        case ExifInterface.ORIENTATION_ROTATE_270:
                        rotateAngle = 270;
                        break;


                        default:
                        break;
                    }

                    bmp = rotateImage(bmp, rotateAngle);
                    mUserImage.setImageBitmap(bmp);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    }

ВАРИАНТ 2:

Используя PhotoPicker, скомпилируйте 'me.iwf.photopicker:PhotoPicker:0.9.5@aar'

public void captureImageCameraOrGallery() {

        PhotoPicker.builder()
                .setPhotoCount(1)
                .setShowCamera(true)
                .setShowGif(true)
                .setPreviewEnabled(false)
                .start(this, PhotoPicker.REQUEST_CODE);
    }

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK && requestCode == PhotoPicker.REQUEST_CODE) {
            if (data != null) {
                ArrayList<String> photos =                       data.getStringArrayListExtra(PhotoPicker.KEY_SELECTED_PHOTOS);
                Uri selectedImageUri = Uri.fromFile(new File(photos.get(0)));

                Bitmap bmp = null;
                try {
                    if (selectedImageUri != null) {
                        bmp = getBitmapFromUri(selectedImageUri);
                    }

                    if (bmp == null) {
                        return;
                    }
                    mUserImage.setImageBitmap(bmp);


                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

Однако он все еще вращается. Любая помощь будет оценена.


person Svitlana    schedule 08.02.2017    source источник


Ответы (2)


Если в вашем первом варианте вы всегда получаете 0 для ориентации, вы можете попробовать следующее. (Из этот пост)

Попробуйте использовать информацию в курсоре содержимого.

float photoRotation = 0;
boolean hasRotation = false;
String[] projection = { Images.ImageColumns.ORIENTATION };
try {
    Cursor cursor = getActivity().getContentResolver().query(photoUri, projection, null, null, null);
    if (cursor.moveToFirst()) {
        photoRotation = cursor.getInt(0);
        hasRotation = true;
    }
    cursor.close();
} catch (Exception e) {}

if (!hasRotation) {
    ExifInterface exif = new ExifInterface(photoUri.getPath());
    int exifRotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION,
            ExifInterface.ORIENTATION_UNDEFINED);

    switch (exifRotation) {
        case ExifInterface.ORIENTATION_ROTATE_90: {
            photoRotation = 90.0f;
            break;
        }
        case ExifInterface.ORIENTATION_ROTATE_180: {
            photoRotation = 180.0f;
            break;
        }
        case ExifInterface.ORIENTATION_ROTATE_270: {
            photoRotation = 270.0f;
            break;
        }
    }
}
person Ivan Leonenko    schedule 08.02.2017
comment
Извините, немного перепутал с флагом !hasRotation. Делаем ли мы поворот в случае, если if (!hasRotation) { //rotate} else { // здесь нужно загрузить изображение без поворота? } - person Svitlana; 09.02.2017
comment
Там двойная проверка - сначала мы проверяем, повернут ли контент с помощью Cursor, если да, то мы устанавливаем флаг и не проверяем информацию exif, если нет, то проверяем информацию exif и получаем данные о повороте оттуда. - person Ivan Leonenko; 09.02.2017
comment
Ок понял спасибо! И еще один вопрос, должен ли я настроить что-то вроде этого: намерение.putExtra(MediaStore.EXTRA_OUTPUT, mCapturedImageURI); при вызове нового намерения и использовании mCapturedImageURI в качестве глобальной переменной? Оказывает ли MediaStore.EXTRA_OUTPUT большое влияние? Или я могу получить просто Uri photoUri = data.getData(); в onActivityResult напрямую? - person Svitlana; 09.02.2017

на некоторых устройствах максимальное изображение на устройстве samsumg поворачивается на 90 градусов. для этого вам нужно проверить его в файле exif, какова его точная ориентация, и в соответствии с этим вы должны работать.

  int rotateDegree = 0;
                try {
                    File imageFile = new File(sourcepath);
                    ExifInterface exif = new ExifInterface(
                            imageFile.getAbsolutePath());
                    int orientation = exif.getAttributeInt(
                            ExifInterface.TAG_ORIENTATION,
                            ExifInterface.ORIENTATION_NORMAL);

                    switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_270:
                        rotateDegree = 270;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_180:
                        rotateDegree = 180;
                        break;
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        rotateDegree = 90;
                        break;
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Matrix matrix = new Matrix();
        matrix.postRotate(rotateDegree );
        bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
person Jitesh Mohite    schedule 08.02.2017
comment
Спасибо за ваш ответ. Однако ротация все же происходит. В любом случае, спасибо. - person Svitlana; 09.02.2017