Как узнать, было ли изображение с галереи получено в портретной или альбомной ориентации с камеры?
- У меня есть изображение в галерее, которое было снято с камеры
- Я пытаюсь выяснить, является ли изображение
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() не возвращает полный путь