Saltar al contenido

¿Android obtiene la orientación de un mapa de bits de la cámara? Y girar hacia atrás -90 grados

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 CameraXen 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *