Cuando cargo una imagen de la galería de medios en un mapa de bits, todo funciona bien, excepto que las imágenes que se tomaron con la cámara mientras se sostiene el teléfono verticalmente se giran para que siempre obtenga una imagen horizontal aunque parezca vertical en el galería. ¿Por qué es eso y cómo puedo cargarlo correctamente?
138
Respuestas:
¿Has mirado los datos EXIF de las imágenes? Puede conocer la orientación de la cámara cuando se tomó la foto.
fuente
Entonces, como ejemplo ...
Primero necesitas crear una ExifInterface:
Luego puede tomar la orientación de la imagen:
Esto es lo que significan los valores de orientación: http://sylvana.net/jpegcrop/exif_orientation.html
Entonces, los valores más importantes son 3, 6 y 8. Si la orientación es
ExifInterface.ORIENTATION_ROTATE_90
(que es 6), por ejemplo, puede girar la imagen de esta manera:Sin embargo, ese es solo un ejemplo rápido. Estoy seguro de que hay otras formas de realizar la rotación real. Pero también los encontrará en StackOverflow.
fuente
OutOfMemoryError
cuando use este enfoque mientras mantiene dos mapas de bits en la memoria al mismo tiempo.Esta es una solución completa (que se encuentra en el ejemplo de Hackbook del SDK de Facebook). Tiene la ventaja de no necesitar acceso al archivo en sí. Esto es extremadamente útil si está cargando una imagen desde el dispositivo de resolución de contenido (por ejemplo, si su aplicación responde a una intención de compartir fotos).
Y luego puede obtener un mapa de bits rotado de la siguiente manera. Este código también reduce la imagen (lamentablemente) a MAX_IMAGE_DIMENSION. De lo contrario, puede quedarse sin memoria.
fuente
ExifInterface exif = new ExifInterface(photoUri.getPath());
y luegoexif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1)
obtener orientación (por ejemploORIENTATION_ROTATE_90
,ORIENTATION_ROTATE_180
)Lo resolví en mi caso con este código usando la ayuda de esta publicación:
Espero que ahorre el tiempo de alguien!
fuente
Use una utilidad para hacer el levantamiento pesado.
9re creó una utilidad simple para manejar el trabajo pesado de manejar datos EXIF y rotar imágenes a su orientación correcta.
Puede encontrar el código de utilidad aquí: https://gist.github.com/9re/1990019
Simplemente descargue esto, agréguelo al
src
directorio de su proyecto y úseloExifUtil.rotateBitmap()
para obtener la orientación correcta, así:fuente
es porque la galería muestra correctamente imágenes rotadas pero no ImageView mira aquí:
y necesitas esto:
fuente
Lo hice funcionar después de muchos intentos gracias a una publicación que ya no puedo encontrar :-(
Exif parece funcionar siempre, la dificultad era obtener la ruta del archivo. El código que encontré hace una diferencia entre API anteriores a 4.4 y posteriores a 4.4. Básicamente, el URI de la imagen para 4.4+ contiene "com.android.providers". Para este tipo de URI, el código usa DocumentsContract para obtener la identificación de la imagen y luego ejecuta una consulta con ContentResolver, mientras que para el SDK anterior, el código va directamente a consultar el URI con ContentResolver.
Aquí está el código (lo siento, no puedo acreditar quién lo publicó):
fuente
Puede leer la ruta desde la tarjeta SD y hacer el siguiente código ... Reemplazará la foto existente después de rotarla ...
No: Exif no funciona en la mayoría de los dispositivos, proporciona los datos incorrectos, por lo que es bueno codificar la rotación antes de guardar en el grado que desee, solo tiene que cambiar el valor del ángulo en postRotate a cualquiera que desee.
fuente
Código de Kotlin:
fuente
Mejoré la respuesta de Teo Inke. Ya no gira la imagen a menos que sea realmente necesario. También es más fácil de leer y debería ejecutarse más rápido.
fuente
Lo primero que necesita es la ruta real del archivo. Si lo tiene genial, si está utilizando URI, use este método para obtener la ruta real:
extraer su mapa de bits, por ejemplo:
puede usar decodeFile () en su lugar si lo desea.
Ahora que tiene el mapa de bits y la ruta real, obtenga la orientación de la imagen:
y finalmente gírelo a la posición correcta así:
Eso es todo, ahora tiene el mapa de bits girado a la posición correcta.
salud.
fuente
Esto funciona, pero probablemente no sea la mejor manera de hacerlo, pero podría ayudar a alguien.
fuente
tal vez esto ayude (girar 90 grados) (esto funcionó para mí)
fuente
El cursor debe cerrarse después de abrirlo.
Aquí hay un ejemplo.
fuente
He derretido @Timmmm answer y @Manuel. Si hace esta solución, no obtendrá una excepción de falta de memoria.
Este método recupera la orientación de la imagen:
Por lo tanto, usaría este método para cambiar el tamaño de la imagen antes de cargarla en la memoria. De esa manera, no obtendrá una excepción de memoria.
Esto funciona perfectamente para mi. Espero que esto ayude a alguien más
fuente
Mejorando la solución anterior de Timmmm para agregar algo de escala adicional al final para garantizar que la imagen se ajuste a los límites:
fuente
Use el siguiente código para rotar una imagen correctamente:
fuente
Los siguientes métodos escalan Y giran el mapa de bits de acuerdo con la orientación:
Ejemplo:
fuente
Resolví el problema con la siguiente solución. Tenga en cuenta que también estoy escalando la imagen, lo cual fue necesario para evitar OutOfMemoryExceptions.
Tenga en cuenta que esta solución no funcionará correctamente con imágenes de retrato o imágenes al revés (gracias, Timmmm, por notarlo). La solución de Timmmm anterior podría ser la mejor opción si se requiere y también se ve más elegante: https://stackoverflow.com/a/8914291/449918
Salud
fuente