Android: Как определить ориентацию изображения (портрет или пейзаж), выбранный из галереи при настройке изображения?

Я устанавливаю изображение на изображении, выбранном из галереи (альбом камеры). Если выбранное изображение имеет альбомную ориентацию, оно отображается отлично, но если изображение в портретном режиме (то есть изображение было нажато в портретном режиме), оно отображает изображение с 90-градусным вращением. Теперь я пытаюсь выяснить ориентацию перед настройкой изображения, но все изображения имеют такую ​​же ориентацию и ту же ширину ширины. Вот мой код:

Uri selectedImage = intent.getData(); if (selectedImage != null) { Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), selectedImage); int str = new ExifInterface(selectedImage.getPath()).getAttributeInt("Orientation", 1000); Toast.makeText(this, "value:" + str, Toast.LENGTH_LONG).show(); Toast.makeText(this, "width:" + bitmap.getWidth() + "height:" + bitmap.getHeight(), Toast.LENGTH_LONG).show(); 

Портретный режимландшафтный режим

Solutions Collecting From Web of "Android: Как определить ориентацию изображения (портрет или пейзаж), выбранный из галереи при настройке изображения?"

Используйте ExifInterface для поворота изображения. Используйте этот метод для получения правильного значения для поворота захваченного изображения с камеры.

 public 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.i("RotateImage", "Exif orientation: " + orientation); Log.i("RotateImage", "Rotate value: " + rotate); } catch (Exception e) { e.printStackTrace(); } return rotate; } 

И поместите этот код в метод результата Activity и получите значение для поворота изображения …

 String selectedImage = data.getData(); String[] filePathColumn = {MediaStore.Images.Media.DATA}; Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null); cursor.moveToFirst(); int columnIndex = cursor.getColumnIndex(filePathColumn[0]); filePath = cursor.getString(columnIndex); cursor.close(); int rotateImage = getCameraPhotoOrientation(MyActivity.this, selectedImage, filePath); 

Надеюсь это поможет..

Это также работает для меня:

 String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cur = getContentResolver().query(imageUri, orientationColumn, null, null, null); int orientation = -1; if (cur != null && cur.moveToFirst()) { orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0])); } Matrix matrix = new Matrix(); matrix.postRotate(orientation); 
  if(bm.getWidth() > bm.getHeight()) { Bitmap bMapRotate=null; Matrix mat=new Matrix(); mat.postRotate(90); bMapRotate = Bitmap.createBitmap(bm, 0, 0,bm.getWidth(),bm.getHeight(), mat, true); bm.recycle(); bm=null; imageDisplayView.setImageBitmap(bMapRotate); }else imageDisplayView.setImageBitmap(bm); 

Другое решение – использовать ExifInterface из библиотеки поддержки: ExifInterface из библиотеки поддержки

Вот отличное решение, с которым я столкнулся:> https://stackoverflow.com/a/34241250/8033090

Однострочное решение:

 Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView); 

или

 Picasso.with(context).load("file:" + photoPath).into(imageView); 

Это позволит автоматически определять вращение и размещать изображение в правильной ориентации

Picasso – очень мощная библиотека для обработки изображений в вашем приложении, включает в себя: сложные преобразования изображений с минимальным использованием памяти. Для загрузки может потребоваться секунда, но я просто поместил какой-то текст за изображение, в котором говорится «Загрузка изображения», и когда изображение загружается, оно покрывает текст.

Эта работа для меня:

 private String getOrientation(Uri uri){ BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; String orientation = "landscape"; try{ String image = new File(uri.getPath()).getAbsolutePath(); BitmapFactory.decodeFile(image, options); int imageHeight = options.outHeight; int imageWidth = options.outWidth; if (imageHeight > imageWidth){ orientation = "portrait"; } }catch (Exception e){ //Do nothing } return orientation; }