2011-01-26 13 views
17

En Android, al descodificar un mapa de bits desde una foto en el teléfono, los datos EXIF ​​en el original se pierden. Estoy enviando este mapa de bits a mi servidor a través de un socket y me gustaría volver a adjuntar los datos EXIF ​​faltantes a los datos que se envían.¿Cómo adjuntar metadatos EXIF ​​a un Bitmap serializado en Android?

tengo algo de código que carga un objeto de mapa de bits de la MediaStore y lo comprime a una matriz de bytes en la preparación para enviarlo a través de una toma:

Bitmap bitmap = ... 
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap); 
bitmap.compress(CompressFormat.JPEG, 70, stream); 
byte[] input = stream.toByteArray(); 

Quiero usar el ExifInterface para llegar a la EXIF metadatos en el jpeg original en la tarjeta SD y de alguna manera agregar eso a la matriz de bytes salientes de una manera que yo sería capaz de extraer un jpeg con todos los EXIF ​​correctos en el servidor (con suerte sin hacer esto en el servidor). Hasta ahora, he conseguido utilizar el ExifInterface para leer todos los datos EXIF:

String path = ... //bitmap file path 
ExifInterface exif = new ExifInterface(path); 
... = exif.getAttribute(...) 

EDIT: En condiciones óptimas, me gustaría encontrar una solución que utiliza ninguna biblioteca. Si pudiera obtener los índices de la matriz de bytes del jpeg original que contiene el EXIF ​​y anteponer/anexar estos bytes a la matriz de bytes producida por bitmap.compress(...), sería lo mejor.

+0

Did a tener éxito con la adición de la información EXIF ​​de matriz de bytes? – Vikas

Respuesta

7

Gracias a @Nick Campion y Sanselan.

código de trabajo:

ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
bitmap.compress(CompressFormat.JPEG, 100, bos); //Bitmap object is your image 
byte[] data = bos.toByteArray(); 

TiffOutputSet outputSet = null; 

IImageMetadata metadata = Sanselan.getMetadata(new File(filepath)); // filepath is the path to your image file stored in SD card (which contains exif info) 
JpegImageMetadata jpegMetadata = (JpegImageMetadata) metadata; 
if (null != jpegMetadata) 
{ 
    TiffImageMetadata exif = jpegMetadata.getExif(); 
    if (null != exif) 
    { 
     outputSet = exif.getOutputSet(); 
    } 
} 
if (null != outputSet) 
{ 
    bos.flush(); 
    bos.close(); 
    bos = new ByteArrayOutputStream(); 
    ExifRewriter ER = new ExifRewriter(); 
    ER.updateExifMetadataLossless(data, bos, outputSet); 
    data = bos.toByteArray(); //Update you Byte array, Now it contains exif information! 
} 
+0

El código anterior a menudo no funciona como se esperaba con Sanselan Android. En particular, si cambia el tamaño de la imagen, el código anterior no solo copiará los metadatos EXIF, sino que también sobrescribirá los datos de su imagen, deshaciendo el cambio de tamaño. Parece ser un problema de Sanselan que otros han encontrado: http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E. Escribí sobre una solución para este problema aquí: http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

Funciona bien conmigo. pero 'Sanselan' debe apuntar a https://commons.apache.org/proper/commons-imaging/ y' Sanselan.getMetadata' se convierte en 'Imaging.getMetadata' – Leon

Cuestiones relacionadas