Как узнать, было ли изображение с галереи получено в портретной или альбомной ориентации с камеры?

  • У меня есть изображение в галерее, которое было снято с камеры
  • Я пытаюсь выяснить, является ли изображение portrait или же landscape

У меня есть путь, полученный из кода ниже, как

/storage/emulated/0/DCIM/Camera/IMG_20181110_211757.jpg

Затем я использую ExifInterface, чтобы найти ориентацию:

 public static void getCameraPhotoOrientation(Activity activity, String imagePath) {



        String path =getPath(activity,imagePath);


        try {
            ExifInterface ei = new ExifInterface(path);
            int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);

            switch (orientation) {
                case ExifInterface.ORIENTATION_ROTATE_270:
                    Timber.d("Type-1");
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    Timber.d("Type-2");
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    Timber.d("Type-3");
                    break;
                case ExifInterface.ORIENTATION_UNDEFINED:
                    Timber.d("Type-4");
                    break;

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

    }

Я всегда ориентируюсь как ExifInterface.ORIENTATION_UNDEFINED


Как решить это

2 ответа

Решение

У меня есть изображение в галерее, которое было снято с камеры

Разработчик не может гарантировать, что какое-либо конкретное изображение получено из приложения камеры, если разработчик не является автором этого приложения камеры.

Я пытаюсь выяснить, является ли изображение портретным или пейзажным

Для изображения не требуется портрет или пейзаж. Например, приложение камеры может обрезать фотографии, чтобы они были круглыми или квадратными.

У меня есть путь, полученный из кода ниже

Этот код не удастся для многих Uri значения на многих устройствах. Если вы хотите использовать ExifInterface для Uri использовать getContentResolver().openInputStream() чтобы получить InputStream на содержание, определенное Uri, а затем передать это InputStream к этому ExifInterface конструктор

Я всегда получаю ориентацию как ExifInterface.ORIENTATION_UNDEFINED

Изображения не должны иметь заголовки EXIF, не говоря уже о ExifInterface.TAG_ORIENTATION,

Если этот тег не существует, вы можете проверить ширину и высоту изображения и сделать предположение:

  • Если ширина больше высоты, это может быть пейзаж
  • Если высота больше ширины, это может быть портрет

Это не удастся для квадратных изображений и не удастся для обрезанных изображений (например, фотография была сделана портретной, но пользователь обрезал ее так, что ширина теперь больше высоты).

Лучшее решение - изменить приложение, чтобы не заботиться о том, является ли изображение портретным или альбомным. Следующее лучшее решение - спросить пользователя, как он хочет обрабатывать изображение, где, возможно, вы используете вышеупомянутый алгоритм, чтобы установить опцию по умолчанию.

Попробуйте, изменив путь доступа к процессу, как показано ниже

File imFile = new File(imagePath);
ExifInterface ei = new ExifInterface(imFile.getAbsolutePath());

это объяснит, что Android getAbsolutePath() не возвращает полный путь

Другие вопросы по тегам