Cómo obtener la orientación correcta de la imagen seleccionada de la galería de imágenes predeterminadas

He revisado algunos de los enlaces para obtener la orientación correcta de la imagen seleccionada desde la galería de imágenes predeterminada para que funcione de manera estándar en todos los dispositivos. La etiqueta exif siempre devuelve 0.

Valor de etiqueta de orientación EXIF ​​siempre 0 para imagen tomada con la aplicación de cámara de retrato de Android

La etiqueta de orientación Exif devuelve 0

Los datos Exif TAG_ORIENTATION siempre 0

http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-android/

¿Cómo obtener una solución exacta que funcione en todos los dispositivos?

Si la imagen (foto) fue tomada por un progtwig hecho por usted, debe establecer Parameters.setRotation con el valor de rotación correcto.

Esto, dependiendo de la unidad de la cámara, gira la imagen antes de guardarla o guarda el valor de rotación en exif TAG_ORIENTATION.

Por lo tanto, si TAG_ORIENTATION es nulo o cero, la imagen tiene la orientación correcta; de lo contrario, debe rotar la imagen de acuerdo con el valor en TAG_ORIENTATION.

CÓDIGO

Obtener orientación de EXIF:

ExifInterface exif = null; try { exif = new ExifInterface(path); } catch (IOException e) { e.printStackTrace(); } int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 

Obtener bitmap rotado:

 Bitmap bmRotated = rotateBitmap(bitmap, orientation); 

Método para rotar el bitmap:

 public static Bitmap rotateBitmap(Bitmap bitmap, int orientation) { Matrix matrix = new Matrix(); switch (orientation) { case ExifInterface.ORIENTATION_NORMAL: return bitmap; case ExifInterface.ORIENTATION_FLIP_HORIZONTAL: matrix.setScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_180: matrix.setRotate(180); break; case ExifInterface.ORIENTATION_FLIP_VERTICAL: matrix.setRotate(180); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_TRANSPOSE: matrix.setRotate(90); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_90: matrix.setRotate(90); break; case ExifInterface.ORIENTATION_TRANSVERSE: matrix.setRotate(-90); matrix.postScale(-1, 1); break; case ExifInterface.ORIENTATION_ROTATE_270: matrix.setRotate(-90); break; default: return bitmap; } try { Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); bitmap.recycle(); return bmRotated; } catch (OutOfMemoryError e) { e.printStackTrace(); return null; } } 

Para mí, ExifInterface funcionó bastante bien así:

 ExifInterface exifInterface = new ExifInterface(imagePath); degree = Integer.parseInt(exifInterface.getAttribute(ExifInterface.TAG_ORIENTATION)); 

o puede intentar obtener los detalles de la imagen usando MediaStore esta manera:

 String[] orientationColumn = {MediaStore.Images.Media.ORIENTATION}; Cursor cur = managedQuery(imageUri, orientationColumn, null, null, null); int orientation = -1; if (cur != null && cur.moveToFirst()) { orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0])); } 

Solución similar: ExifInterface siempre devuelve 1

Espero eso ayude.. 🙂

Seguí la última respuesta e intenté crear un sistema para administrar imágenes, rotar, cambiar el tamaño, almacenar en caché y cargar en ImageViews y puedo decir que es un infierno. Incluso cuando todo estaba hecho, los lockings a veces causan OutOfMemory en algunos dispositivos. La respuesta es correcta, pero es difícil administrar mapas de bits en Android.

Mi punto es que no reinventar la rueda, tiene un diseño perfecto. Google mismo lo alienta a usar Glide . Funciona en una sola línea, súper fácil de usar, liviano en tamaño y número de funciones, administra EXIF ​​de forma predeterminada , y usa la memoria como un amuleto. Simplemente está codificado con magia negra;)

No estoy seguro si Picasso también administra EXIF, pero hay una introducción rápida para ambos:

https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

Mi consejo: no pierdas tu tiempo y úsalas. Puedes resolver tu problema en una línea:

 Glide.with(context).load("http://sofes.miximages.com/android/DvpvklR.jpg").into(imageView); 

Para los que vengan a este post, asegúrese de usar la interfaz externa de la Biblioteca de soporte de Android que se introdujo en diciembre de 2016:

 compile "com.android.support:exifinterface:25.1.0" // or newer 

Los detalles sobre esta biblioteca se pueden encontrar en la publicación del blog de Desarrolladores de Android: Presentación de la Biblioteca de soporte de ExifInterface

También incluyeron un código de muestra para tratar la información de rotación almacenada en la interfaz exif:

 int rotation = 0; int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: rotation = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: rotation = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: rotation = 270; break; }