android - modificar - programa para ver metadatos de una imagen
Ajuste de imagen de Android y preservación de datos EXIF(orientación, rotación, etc.) (3)
Como han indicado otros, debe copiar los datos EXIF de la imagen original a la imagen final redimensionada. La biblioteca de Sanselan Android suele ser la mejor para esto. Dependiendo de la versión del sistema operativo Android, ExifInterface a veces corrompe los datos EXIF. Además, ExifInterface también maneja un número limitado de etiquetas Exif, es decir, solo las etiquetas que "conoce". Sanselan, por otro lado, mantendrá todas las etiquetas EXIF y notas de marcador.
Aquí hay una publicación de blog que muestra cómo usar Sanselan para copiar datos de imágenes: http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/
Por cierto, en Android también tiendo a rotar las imágenes y eliminar la etiqueta Orientation EXIF. Por ejemplo, en un Nexus S con Android 4.03, la cámara estaba configurando una etiqueta de orientación en los metadatos EXIF, pero la vista web ignoraba esa información y mostraba la imagen incorrectamente. Tristemente, la rotación de los datos de imagen reales y la eliminación de la etiqueta de orientación EXIF es la única forma de que todos los programas muestren las imágenes correctamente.
Si su aplicación de Android usa la cámara del dispositivo para tomar una foto y luego cambiar su tamaño (esto es muy, muy común para reducir el tamaño de carga), es posible que no se dé cuenta de que esta operación de cambio de tamaño elimina los metadatos exif.
Esto puede causar problemas, especialmente si el dispositivo en cuestión se basa en la etiqueta ''Orientación'' para mostrar correctamente la imagen en posición vertical.
Diferentes dispositivos Android manejan la rotación de la cámara / imagen de diferentes maneras: mi fiel Nexus One siempre gira la imagen inmediatamente después de la captura, por lo que los contenidos nativos del archivo siempre están "en posición vertical" cuando se ven. Sin embargo, otros dispositivos (especialmente los teléfonos Samsung en mis pruebas) no rotan el contenido del archivo de imagen, sino que configuran la etiqueta exif ''Orientación''. Cada vez que se muestre la imagen más tarde, el código de imagen relevante debería detectar la presencia de la "etiqueta" de orientación y rotar la imagen de manera apropiada. Pero si ha realizado un procesamiento de mapa de bits en la imagen y lo ha guardado en un nuevo archivo, se perderán todos los datos exif.
Además de los datos de Orientación, también puede perder otros metadatos valiosos como marca / modelo, etc.
Esto me confundió por unas semanas (la imagen aparece en posición vertical cuando se muestra en la galería telefónica, pero luego llega a mi servidor con mala orientación y sin metadatos aparentes). Estoy agregando esta auto-pregunta aquí para ayudar a otros. Esta publicación de blog fue muy útil:
http://vikaskanani.wordpress.com/2011/07/17/android-re-size-image-without-loosing-exif-information/
Para los perezosos, aquí hay una función reutilizable:
public static void copyExif(String oldPath, String newPath) throws IOException
{
ExifInterface oldExif = new ExifInterface(oldPath);
String[] attributes = new String[]
{
ExifInterface.TAG_APERTURE,
ExifInterface.TAG_DATETIME,
ExifInterface.TAG_DATETIME_DIGITIZED,
ExifInterface.TAG_EXPOSURE_TIME,
ExifInterface.TAG_FLASH,
ExifInterface.TAG_FOCAL_LENGTH,
ExifInterface.TAG_GPS_ALTITUDE,
ExifInterface.TAG_GPS_ALTITUDE_REF,
ExifInterface.TAG_GPS_DATESTAMP,
ExifInterface.TAG_GPS_LATITUDE,
ExifInterface.TAG_GPS_LATITUDE_REF,
ExifInterface.TAG_GPS_LONGITUDE,
ExifInterface.TAG_GPS_LONGITUDE_REF,
ExifInterface.TAG_GPS_PROCESSING_METHOD,
ExifInterface.TAG_GPS_TIMESTAMP,
ExifInterface.TAG_IMAGE_LENGTH,
ExifInterface.TAG_IMAGE_WIDTH,
ExifInterface.TAG_ISO,
ExifInterface.TAG_MAKE,
ExifInterface.TAG_MODEL,
ExifInterface.TAG_ORIENTATION,
ExifInterface.TAG_SUBSEC_TIME,
ExifInterface.TAG_SUBSEC_TIME_DIG,
ExifInterface.TAG_SUBSEC_TIME_ORIG,
ExifInterface.TAG_WHITE_BALANCE
};
ExifInterface newExif = new ExifInterface(newPath);
for (int i = 0; i < attributes.length; i++)
{
String value = oldExif.getAttribute(attributes[i]);
if (value != null)
newExif.setAttribute(attributes[i], value);
}
newExif.saveAttributes();
}
[auto respuesta]
Afaict, no hay un mecanismo para persistir los metadatos de forma automática o incluso una instantánea de lo que está allí y la transferencia a granel.
Más bien, parece que debe verificar explícitamente las propiedades específicas y copiarlas usted mismo en el nuevo archivo de imagen utilizando ExifInterface.
http://developer.android.com/reference/android/media/ExifInterface.html
Entonces algo así como:
ExifInterface oldExif = new ExifInterface(oldImagePath);
String exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION);
if (exifOrientation != null) {
ExifInterface newExif = new ExifInterface(imagePath);
newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation);
newExif.saveAttributes();
}