android - saber - Cómo obtener la orientación correcta de la imagen seleccionada de la galería de imágenes predeterminadas
hashtagify (4)
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.
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?
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;
}
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 bloqueos 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://i.imgur.com/DvpvklR.png").into(imageView);
Si la imagen (foto) fue tomada por un programa 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 mapa de bits rotado:
Bitmap bmRotated = rotateBitmap(bitmap, orientation);
Método para rotar el mapa de bits:
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;
}
}