Как узнать, было ли изображение с галереи получено в портретной или альбомной ориентации с камеры? - PullRequest
0 голосов
/ 10 ноября 2018
  • У меня есть изображение в галерее, которое было взято с камеры
  • Я пытаюсь выяснить, является ли изображение 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 ]

0 голосов
/ 10 ноября 2018

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

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

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

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

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

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

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

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

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

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

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

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

0 голосов
/ 10 ноября 2018

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

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

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

...