Ориентация изображения от цели галереи / камеры

Я получаю изображение к моему приложению от намерения камеры / галереи. Во многих телефонах изображение, которое я прочитал из намерения / Uri, уже повернуто для правильной ориентации. Например, N1, Legend, Desire, это так.

Но тогда на некоторых телефонах (например, Milestone1, GalaxyS) картина всегда в ландшафте больше независимо от того, каким образом была сделана фотография. Это означает, что в моем приложении портретный образ представляется неверно для пользователя. Я попытался прочитать EXIF-информацию на картинке, но тег ориентации всегда равен 0. Должен быть способ узнать правильную ориентацию изображения, потому что в Milestone1 приложение галереи правильно отображает портретные изображения.

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

Спасибо за помощь!

Флориан отвечает на изображения галереи.

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

Код:

public static int getCameraPhotoOrientation(Context context, Uri imageUri, String imagePath){ int rotate = 0; try { context.getContentResolver().notifyChange(imageUri, null); File imageFile = new File(imagePath); ExifInterface exif = new ExifInterface( imageFile.getAbsolutePath()); int orientation = exif.getAttributeInt( ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } Log.v(TAG, "Exif orientation: " + orientation); } catch (Exception e) { e.printStackTrace(); } return rotate; } 

EDIT: Как можно прочитать в комментариях, некоторые устройства не поддерживают информацию Exif, havn't проверили, но я думаю, что HTC этого не делает. Не забудьте проверить, какие устройства и создать альтернативу.

Следующий метод возвращает ориентацию изображения в градусах. Он работает с изображениями из галереи. Возвращаемые значения для:

  • Обычный пейзаж: 0
  • Нормальный портрет: 90
  • Перевернутый пейзаж: 180
  • Перевернутый портрет: 270
  • Изображение не найдено: -1

Код:

 public static int getOrientation(Context context, Uri photoUri) { Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); try { if (cursor.moveToFirst()) { return cursor.getInt(0); } else { return -1; } } finally { cursor.close(); } } 
  int rotate = 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: rotate = 270; break; case ExifInterface.ORIENTATION_ROTATE_180: rotate = 180; break; case ExifInterface.ORIENTATION_ROTATE_90: rotate = 90; break; } } catch (Exception e) { e.printStackTrace(); } Matrix matrix = new Matrix(); matrix.postRotate(rotate); bitmap = Bitmap.createBitmap(bitmap , 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 

Это лучший ответ, который я нашел, раралалом. https://stackoverflow.com/a/20480741/2258389
Отлично подходит для галереи или камеры

Сначала нужно создать объект галереи, используя contentresolver, а затем передать uri, созданный для намерения захвата изображения. Затем вы можете посмотреть данные exif, а не данные ориентации галереи.

 Matrix matrix = new Matrix(); ExifInterface exifReader = new ExifInterface(filePath); int orientation = exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1); if (orientation ==ExifInterface.ORIENTATION_NORMAL) { // Do nothing. The original image is fine. } else if (orientation == ExifInterface.ORIENTATION_ROTATE_90) { matrix.postRotate(90); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) { matrix.postRotate(180); } else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) { matrix.postRotate(270); } 

У меня такая же проблема с S1, и я заметил, что даже если вы откроете изображение с помощью приложения к галерее, оно откроется в ландшафтном режиме (телефон не знает правильной ориентации для фото).
И если вы повернете телефон к портрету в приложении камеры, значки (возьмите pic, focus и settings) не будут повернуты, попробуйте, чтобы на S2 или на любом устройстве поддерживалась пейзаж / портретная камера, эти значки будут повернуты.

Я уверен, что приложение камеры для камеры не поддерживает съемку в режиме пропорционального доступа.

Я уже сделал это для проекта, потому что у меня была такая же проблема (Android думает, что вы сделаете только картинку на пейзаже). То, что я сделал, это определить ориентацию телефона в то время, а затем повернуть изображение. Он предполагает, что ориентация остается прежней, когда намерение получено.

Это похоже на ту же проблему, которая была решена в этом вопросе: Android: битмапы, загруженные из галереи, повернуты в ImageView

Используйте его так!

 private static int exifToDegrees(int exifOrientation) { if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) { return 180; } else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) { return 270; } return 0; } 

И в коде,

 Bitmap newImage = Bitmap.createBitmap(actualImage, 0, 0, width, height, matrix, true); 

Просто!

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

Для получения информации об ориентации изображения мы можем использовать интерфейс Exif. Это оно!

Простые exiftodegree ответы только последовательно работают, когда вы сделали фотографию, и я использую ее для этого. Для тех из вас, кто испытывает проблемы с выбором фотографии и правильной ориентацией, см. Мой ответ здесь: Ориентация изображения – Android

Intereting Posts
Android: rebuild теперь требует уровня соответствия компилятора 5.0 или 6.0. Вместо этого найдено «1.7». Зачем удалять @Override? Проверка подписи на покупку приложения с помощью PHP openssl Можно ли загружать ресурсы локализации во время выполнения? Как получить доступную высоту экрана минус панель навигации в HoneyComb? Предотвращение пиратства в Android с помощью запросов сервера Android BadParcelableException только с подписанным apk Пользовательский выбранный цвет текста вкладки в SlidingTabLayout Приложение вылетает при открытии съемника в зефире Android Webview не может сосредоточиться на своих элементах Создание Android Libs, которые экспортируют активность Использование AsyncTask для загрузки изображений в пользовательский адаптер Открытие URI в приложении для Android groid с новой версией приложения Gmail Как добавить новую строку в html-формате в android? Unsolved: запись звука на Android с использованием примера из Google Android ActivityOptions.isReturning () NullPointerException