Предназначение камеры Android Сохранение ландшафта изображения при съемке

Я посмотрел вокруг, но, похоже, не существует твердого ответа / решения проблемы, которая очень раздражает.

Я делаю снимок в портретной ориентации, и когда я нажимаю save / discard, кнопки также находятся в правильной ориентации. Проблема в том, что затем я получаю изображение позже, когда оно находится в альбомной ориентации (изображение было повернуто на 90 gradleусов против часовой стрелки)

Я не хочу заставить пользователя использовать камеру в определенной ориентации.

Есть ли способ определить, была ли сделана фотография в портретном режиме, а затем декодировать bitmap и перевернуть его правильно?

Изображение всегда берется в ориентации, которую камера встроила в устройство. Чтобы ваше изображение повернулось правильно, вам нужно будет прочитать информацию о ориентации, которая хранится в изображении (EXIF-метаданные). Там хранится то, как устройство было ориентировано, когда изображение было снято.

Вот код, который считывает данные EXIF ​​и соответственно поворачивает изображение: file – это имя файла изображения.

 BitmapFactory.Options bounds = new BitmapFactory.Options(); bounds.inJustDecodeBounds = true; BitmapFactory.decodeFile(file, bounds); BitmapFactory.Options opts = new BitmapFactory.Options(); Bitmap bm = BitmapFactory.decodeFile(file, opts); ExifInterface exif = new ExifInterface(file); String orientString = exif.getAttribute(ExifInterface.TAG_ORIENTATION); int orientation = orientString != null ? Integer.parseInt(orientString) : ExifInterface.ORIENTATION_NORMAL; int rotationAngle = 0; if (orientation == ExifInterface.ORIENTATION_ROTATE_90) rotationAngle = 90; if (orientation == ExifInterface.ORIENTATION_ROTATE_180) rotationAngle = 180; if (orientation == ExifInterface.ORIENTATION_ROTATE_270) rotationAngle = 270; Matrix matrix = new Matrix(); matrix.setRotate(rotationAngle, (float) bm.getWidth() / 2, (float) bm.getHeight() / 2); Bitmap rotatedBitmap = Bitmap.createBitmap(bm, 0, 0, bounds.outWidth, bounds.outHeight, matrix, true); 

ОБНОВЛЕНИЕ 2017-01-16

С выпуском 25.1.0 Support Library была представлена ​​библиотека поддержки ExifInterface, которая, возможно, упростит доступ к атрибутам Exif. См . Блог разработчика Android для статьи об этом.

В выбранном ответе используется наиболее распространенный метод ответа на этот и подобные вопросы. Тем не менее, это не сработало для меня с передней и задней камеры на Samsung. Для тех, кто нуждается в другом решении, которое работает как передними, так и задними камерами для Samsung и других крупных производителей, этот ответ nvhausid является потрясающим:

https://stackoverflow.com/a/18915443/6080472

Для тех, кто не хочет переходить по ссылке, подходящей магией является использование CameraInfo, а затем использование EXIF ​​или курсора над медиафайлами.

 Bitmap realImage = BitmapFactory.decodeByteArray(data, 0, data.length); android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); android.hardware.Camera.getCameraInfo(mCurrentCameraId, info); Bitmap bitmap = rotate(realImage, info.orientation); 

Полный код в ссылке.

  • Предварительный просмотр камеры для Android
  • Как захватить изображение и сохранить его с помощью встроенной камеры Android
  • широковещательный приемник не получит событие камеры
  • Управление камерой для съемки в портрете не приводит к повороту окончательных изображений
  • Android MediaRecorder - «start failed: -19»
  • Interesting Posts

    Сгенерировать фиктивную переменную

    Данные дочернего компонента VueJS доступа от родительского

    Количество слов в строке Swift для вычисления количества слов

    Марширование коллекции байтов байтов в структуру для вытягивания значений

    Рекурсивная последовательность Фибоначчи

    Выбор элементов по атрибуту

    Django – id vs pk

    Получите данные Exif от UIImage – UIImagePickerController

    java.lang.ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле classа javax / mail / MessagingException

    Защищенные веб-службы: REST через HTTPS и SOAP + WS-Security. Что лучше?

    Gvim Как изменить цвета синтаксиса colorscheme?

    Для чего нужен DataContext?

    Как изменить заголовок кнопки «Назад» на панели навигации

    Как «= по умолчанию» отличается от «{}» для конструктора и деструктора по умолчанию?

    Ffmpeg: Ошибка переполнения очереди буфера появляется при добавлении звука с помощью amix для наложения фильтрованного видео

    Давайте будем гением компьютера.