Предназначение камеры Android Сохранение ландшафта изображения при съемке
Я посмотрел вокруг, но, похоже, не существует твердого ответа / решения проблемы, которая очень раздражает.
Я делаю снимок в портретной ориентации, и когда я нажимаю save / discard, кнопки также находятся в правильной ориентации. Проблема в том, что затем я получаю изображение позже, когда оно находится в альбомной ориентации (изображение было повернуто на 90 gradleусов против часовой стрелки)
Я не хочу заставить пользователя использовать камеру в определенной ориентации.
- Активность kill / onCreate вызвана после съемки с помощью намерения
- Заставить камеру всегда открывать в портретном режиме в android
- Камера: функция setDisplayOrientation не работает для Samsung Galaxy ACE с Android 2.3.6
- как установить ориентацию изображения камеры?
- Android-камера android.hardware.Camera устарела
Есть ли способ определить, была ли сделана фотография в портретном режиме, а затем декодировать bitmap и перевернуть его правильно?
- Неисправность работы с камерой в onActivityResult
- Как захватить и сохранить изображение с помощью пользовательской камеры в Android?
- Android-камера: намерение данных возвращает null
- Прекратить сохранение фотографий с помощью встроенной камеры Android
- Значение тега ориентации EXIF всегда 0 для изображения, сделанного с помощью приложения для портретов с вертикальной камерой
- Назначение камеры Android
- Как получить результат камеры как uri в папке с данными?
- Android: BroadcastReceiver намерен обнаружить фотокамеру камеры?
Изображение всегда берется в ориентации, которую камера встроила в устройство. Чтобы ваше изображение повернулось правильно, вам нужно будет прочитать информацию о ориентации, которая хранится в изображении (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);
Полный код в ссылке.