Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

Изображение всегда берется в ориентации камеры, встроенной в устройство. Чтобы ваше изображение повернулось правильно, вам нужно будет прочитать информацию о ориентации, которая хранится в изображении (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 для статьи об этом.

Ответ 2

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

fooobar.com/info/12188/...

Для тех, кто не хочет переходить по ссылке, подходящей магией является использование 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);

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