Я снимаю изображение и настраиваю его на просмотр изображения.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// imageView.setImageBitmap(bitmap);
imageView.setImageURI(imageUri);
}
else {
}
}
public Bitmap getBitmapFromUri() {
getContentResolver().notifyChange(imageUri, null);
ContentResolver cr = getContentResolver();
Bitmap bitmap;
try {
bitmap = android.provider.MediaStore.Images.Media.getBitmap(cr, imageUri);
return bitmap;
}
catch (Exception e) {
e.printStackTrace();
return null;
}
}
Но проблема в том, что изображение на некоторых устройствах каждый раз поворачивается. Например, на устройстве Samsung он работает хорошо, но на Sony Xperia изображение поворачивается на 90 градусов, а на Toshiba Thrive (планшет) - на 180 градусов.
Ответы:
Большинство телефонных камер имеют альбомную ориентацию. Это означает, что если вы сделаете фотографию в портретной ориентации, полученные фотографии будут повернуты на 90 градусов. В этом случае программное обеспечение камеры должно заполнять данные Exif в той ориентации, в которой должна просматриваться фотография.
Обратите внимание, что приведенное ниже решение зависит от производителя программного обеспечения / устройства камеры, заполняющего данные Exif, поэтому оно будет работать в большинстве случаев, но не является надежным на 100%.
Вот
rotateImage
метод:источник
exif.getAttributeInt
использованияExifInterface.ORIENTATION_UNDEFINED
почти такой же, так как второй параметр является значением по умолчанию в случае, если функция не может предоставить значение.Объединив Джейсон Робинсон «s ответ с Felix » s ответ и заполнение недостающих частей, здесь окончательное комплексное решение для этого вопроса , который будет делать следующее после тестирования на Android Android 4.1 ( Jelly Bean ), Android 4.4 ( KitKat ) и Android 5.0 ( леденец ).
меры
Уменьшите изображение, если оно было больше, чем 1024x1024.
Поверните изображение в правильное положение, только если оно было повернуто на 90, 180 или 270 градусов.
Переработайте повернутое изображение для памяти.
Вот часть кода:
Вызовите следующий метод с текущим
Context
и изображением,URI
которое вы хотите исправитьВот
CalculateInSampleSize
метод из ранее упомянутого источника :Затем идет метод, который будет проверять текущую ориентацию изображения, чтобы определить угол поворота
Наконец, сам метод вращения
- Не забудьте проголосовать за тех парней, которые ответили за их усилия, и за Шириша Хервейда, который задал этот полезный вопрос.
источник
Легко определить ориентацию изображения и заменить растровое изображение, используя:
Чтобы избежать появления воспоминаний с большими изображениями, я бы порекомендовал вам изменить масштаб изображения, используя:
Невозможно использовать ExifInterface для получения ориентации, поскольку проблема в ОС Android: https://code.google.com/p/android/issues/detail?id=19268.
И вот
calculateInSampleSize
источник
Одноканальное решение:
Или
Это автоматически определит поворот и поместит изображение в правильную ориентацию
Picasso - очень мощная библиотека для обработки изображений в вашем приложении, включающая в себя: Сложные преобразования изображений с минимальным использованием памяти.
источник
Я потратил много времени в поисках решения для этого. И наконец-то удалось это сделать. Не забудьте высказать ответ @ Джейсон Робинсон, потому что мой основан на его.
Итак, во-первых, вы должны знать, что начиная с Android 7.0 мы должны использовать
FileProvider
и что-то вызыватьContentUri
, в противном случае вы получите досадную ошибку при попытке вызвать вашуIntent
. Это пример кода:getUriFromPath(Context, String)
Основа метода на пользовательской версии Android создатьFileUri (file://...)
илиContentUri (content://...)
и там это:После
onActivityResult
того, как вы можете поймать этоuri
когда изображение сохраняется камерой, но теперь вам нужно определить вращение камеры, здесь мы будем использовать модифицированный ответ @Jason Robinson:Сначала нам нужно создать
ExifInterface
на основеUri
Выше код может быть упрощен, но я хочу показать все. Так что
FileUri
мы можем создаватьExifInterface
на основеString path
, ноContentUri
мы не можем, Android не поддерживает это.В этом случае мы должны использовать другой конструктор на основе
InputStream
. Помните, что этот конструктор не доступен по умолчанию, вам нужно добавить дополнительную библиотеку:Теперь мы можем использовать
getExifInterface
метод, чтобы получить наш угол:Теперь у вас есть угол, чтобы правильно повернуть изображение :).
источник
activity_main.xml
MainActivity.java
источник
Вы можете просто прочитать ориентацию датчика камеры, как указано Google в документации: https://developer.android.com/reference/android/hardware/camera2/CameraCharacteristics.html
Образец кода:
источник
Джейсон Робинсон ответ и Сам Eltamawy ответ является свободно.
Просто улучшение, чтобы завершить подход, вы должны использовать Compat ExifInterface.
com.android.support:exifinterface:${lastLibVersion}
Вы сможете создать экземпляр ExifInterface (pior API <24) с
InputStream
(fromContentResolver
) вместо путей uri, избегая «Файл не найден исключений»https://android-developers.googleblog.com/2016/12/introducing-the-exifinterface-support-library.html
источник
Обычно рекомендуется решить проблему с ExifInterface , как и предлагал @Jason Robinson. Если этот подход не работает, вы можете попытаться найти ориентацию последнего полученного изображения ...
источник
К сожалению, ответ @ jason-robinson выше не работал для меня.
Хотя функция поворота работает отлично:
Мне нужно было сделать следующее, чтобы получить ориентацию, так как ориентация Exif всегда была 0
источник
Лучше постарайтесь сделать снимок в определенной ориентации.
Для достижения наилучших результатов задайте альбомную ориентацию при просмотре с камеры.
источник
Если кто - то испытывает проблемы с
ExifInterface
на Android 4.4 (KitKat) для получения ориентации, это может быть из - за неправильного пути получил от URI. Смотрите решение для propoergetPath
в вопросе переполнения стека. Получите реальный путь от URI, Android KitKat - новая структура доступа к хранилищуисточник
Найдите ниже ссылку это решение является лучшим https://www.samieltamawy.com/how-to-fix-the-camera-intent-rotated-image-in-android/
источник
Выбранный ответ использует наиболее распространенный метод ответа на этот и аналогичные вопросы. Тем не менее, он не работает с передней и задней камерами на Samsung. Для тех, кто ищет решение, которое работает как с передними, так и с задними камерами для Samsung и других крупных производителей, этот ответ от nvhausid потрясающий:
https://stackoverflow.com/a/18915443/6080472
Для тех, кто не хочет переходить по ссылкам, уместно использовать CameraInfo, а не полагаться на EXIF.
Полный код в ссылке.
источник
Это может быть само собой разумеется, но всегда помните, что вы можете решить некоторые из этих проблем обработки изображений на вашем сервере. Я использовал ответы, подобные тем, которые содержатся в этой теме, для непосредственного отображения изображения. Однако мое приложение требует, чтобы изображения сохранялись на сервере (это, вероятно, распространенное требование, если вы хотите, чтобы изображение сохранялось, когда пользователи переключают телефоны).
Решения, содержащиеся во многих потоках, относящихся к этой теме, не обсуждают отсутствие постоянства данных EXIF, которые не выдерживают сжатие растрового изображения, а это означает, что вам нужно будет поворачивать изображение каждый раз, когда ваш сервер загружает его. Кроме того, вы можете отправить данные ориентации EXIF на ваш сервер, а затем повернуть изображение там, если это необходимо.
Мне было легче создать постоянное решение на сервере, потому что мне не нужно было беспокоиться о секретных путях файлов Android.
источник
Самое простое решение этой проблемы:
Я сохраняю изображение в формате jpg.
источник
Вот
Xamarin.Android
версия:От @Jason Робинсон ответа :
Тогда
calculateInSampleSize
метод:От @Sami Eltamawy в ответ :
источник
Если вы используете Fresco, вы можете использовать это -
Это автоматически поворачивает изображения на основе данных Exif.
Источник: https://frescolib.org/docs/rotation.html
источник
Приведенный ниже код работал со мной, он получил растровое изображение из fileUri и, при необходимости, выполняет исправление поворота:
источник
Получил ответ на эту проблему без использования ExifInterface . Мы можем получить поворот камеры на передней или задней камере, в зависимости от того, что вы используете, и затем при создании растрового изображения мы можем повернуть растровое изображение с помощью Matrix.postRotate (степень)
После расчета поворота вы можете повернуть растровое изображение, как показано ниже:
Herare BM должен быть вашим растровым изображением.
Если вы хотите узнать поворот передней камеры, просто измените Camera.CameraInfo.CAMERA_FACING_BACK на Camera.CameraInfo.CAMERA_FACING_FRONT выше.
Надеюсь, это поможет.
источник
Я создал функцию расширения Kotlin, которая упрощает работу для разработчиков Kotlin на основе ответа @Jason Robinson. Я надеюсь, что это помогает.
источник
Существует более простая команда, чтобы исправить эту ошибку.
Просто добавьте после yourImageView.setBitmap (bitmap); this yourImageView.setRotation (90);
Это исправило мое. Надеюсь, поможет !
источник
это сработало для меня
источник