los - ¿Cómo adjuntar metadatos EXIF a un Bitmap serializado en Android?
firebase storage android (1)
En Android, al descodificar un mapa de bits de 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 que faltan a los datos que se envían.
Tengo algo de código que carga un objeto de mapa de bits de MediaStore y lo comprime en una matriz de bytes en preparación para enviarlo a través de un socket:
Bitmap bitmap = ...
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap);
bitmap.compress(CompressFormat.JPEG, 70, stream);
byte[] input = stream.toByteArray();
Quiero usar ExifInterface para obtener los metadatos EXIF en el jpeg original en la tarjeta SD y de alguna manera agregar eso a la matriz de bytes de salida de manera que pueda extraer un jpeg con todo el EXIF correcto en el servidor Lado (esperemos que sin hacer esto en el servidor). Hasta ahora, logré usar el ExifInterface para leer todos los datos EXIF:
String path = ... //bitmap file path
ExifInterface exif = new ExifInterface(path);
... = exif.getAttribute(...)
EDITAR: de manera óptima, me gustaría encontrar una solución que no utilice bibliotecas. Si pudiera obtener los índices de la matriz de bytes del jpeg original que contiene el EXIF y añadir / agregar estos bytes a la matriz de bytes producida por bitmap.compress(...)
sería lo mejor.
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!
}