Si hallas algún error con tu código o trabajo, recuerda probar siempre en un entorno de testing antes añadir el código al trabajo final.
Solución:
Si se toma una foto con una cámara digital o un teléfono inteligente, la rotación a menudo se almacena en los datos Exif de la foto, como parte del archivo de imagen. Puede leer los metadatos Exif de una imagen con Android ExifInterface
.
Primero, crea el ExifInterface
:
ExifInterface exif = new ExifInterface(uri.getPath());
A continuación, encuentre la rotación actual:
int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
Convierta la rotación exif a grados:
int rotationInDegrees = exifToDegrees(rotation);
donde
private static int exifToDegrees(int exifOrientation)
if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) return 90;
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) return 180;
else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) return 270;
return 0;
Luego use la rotación real de la imagen como punto de referencia para rotar la imagen usando un Matrix
.
Matrix matrix = new Matrix();
if (rotation != 0) matrix.preRotate(rotationInDegrees);
La nueva imagen girada se crea con el Bitmap.createBitmap
método que toma un Matrix
como parámetro:
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
donde Matrix m
mantiene la nueva rotación:
Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);
Consulte este tutorial para obtener un ejemplo de código fuente útil:
- Leer información Exif en un archivo JPEG.
La última respuesta fue técnicamente perfecta, pero traté de 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 se hizo, a veces se bloquea y causa OutOfMemory en algunos dispositivos.
Mi punto es no reinventar la rueda, tiene un diseño perfecto. Google mismo te anima a usar Glide. Funciona en una línea, súper fácil de usar, liviano en tamaño y número de funciones, gestiona EXIF por defectoy usa la memoria como un amuleto … Es simplemente magia negra codificada;)
No estoy seguro de si Picasso también maneja EXIF, pero hay una introducción rápida a ambos:
https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en
Mi consejo: no pierdas tu tiempo y úsalos. Puede resolver su problema en una línea:
Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);
si estás usando Jetpack CameraX
en el interior onImageCaptured
método puede acceder al grado de rotación proporcionado por EXIF
datos de la imageProxy
Me gusta esto:
image.imageInfo.rotationDegrees
luego, mientras configura su imagen, puede rotar su imagen de acuerdo con este grado
Si posees alguna desconfianza y forma de arreglar nuestro crónica te inspiramos ejecutar una observación y con deseo lo estudiaremos.