2011-01-04 38 views
5

estoy copiando una imagen a un directorio privado de este modo:Copia de una imagen, pierde los datos Exif

FileChannel source = null; 
FileChannel destination = null; 
source = new FileInputStream(sourceFile).getChannel(); 
destination = new FileOutputStream(destFile).getChannel(); 
destination.transferFrom(source, 0, source.size()); 
source.close(); 
destination.close(); 

..pero cuando inserto de nuevo en a la galería, sin tocar, en un momento posterior:

private void moveImageToGallery(Uri inUri) throws Exception { 
    MediaStore.Images.Media.insertImage(getContentResolver(), ImageUtil.loadFullBitmap(inUri.getPath()), null, null); 
} 

..aparentemente pierde sus datos Exif. La rotación ya no funciona. ¿Hay alguna forma de que pueda copiar un archivo de imagen y no perder esos datos? Gracias por cualquier sugerencia.

+0

Purusing a través del grupo Google Android me lleva a creer que esto es un problema del sistema operativo, uno dev dijo: "Parece que una de estas solicitudes válidas". –

+1

Es difícil que no hay una buena manera de hacerlo. Lo que puede hacer es copiar el archivo y, antes de insertarlo, usar ExifInterface para agregar los atributos que puede leer de la base de datos de imágenes, como rotación, latitud/longitud y fecha tomada. Luego, cuando inserte la imagen, debería leerla correctamente y agregarla a la nueva entrada de la base de datos. ¡Guau, me acabo de dar cuenta de que tiene 2 años! Estoy seguro de que ya has hecho algo como esto, pero dejaré mi respuesta aquí. No estoy seguro de por qué esto estaba en la parte superior de la lista de preguntas de Android. –

Respuesta

2

FileChannel, aquí parece leer los datos, decodificarlos, volver a codificarlos y luego escribirlos; perdiendo así los datos EXIF. Copiar un archivo (byte a byte) no altera su contenido. Lo único que puede suceder antes/después de una copia es un cambio de acceso a archivos (recuerde: Android está basado en Linux, Linux es un UNIX => permisos rwx (vea chmod)), eventualmente denegará la lectura o escritura del archivo. Por lo tanto, está claro FileChannel hace algo no deseado.

Este código hará el trabajo:

InputStream in = new FileInputStream(source); 
OutputStream out = new FileOutputStream(dest); 
byte[] buf = new byte[1024]; int len; 
while ((len = in.read(buf)) > 0) 
    out.write(buf, 0, len); 
in.close(); 
out.close(); 
+0

Voy a intentarlo. Supuse que tenía que pasar por el "canal" de Android cuando manipulaba fotos de la galería, pero parece que no es el caso, es solo una fiesta para todos. –

Cuestiones relacionadas