Как подключить метаданные EXIF к сериализованному растровому изображению на Android?
В Android при декодировании растрового изображения из фотографии на телефоне данные EXIF в оригинале теряются. Я отправляю это Bitmap
на свой сервер через сокет и хочу повторно присоединить отсутствующие данные EXIF к отправляемым данным.
У меня есть некоторый код, который загружает объект Bitmap
из MediaStore
и сжимает его в байтовом массиве для подготовки к отправке через сокет:
Bitmap bitmap = ...
ByteArrayOutputStream stream = new ByteArrayOutputStream(bitmap);
bitmap.compress(CompressFormat.JPEG, 70, stream);
byte[] input = stream.toByteArray();
Я хочу использовать ExifInterface
чтобы получить метаданные EXIF в исходном jpeg на SD-карте и каким-то образом добавить его в исходящий байтовый массив таким образом, чтобы я мог извлечь jpeg со всеми правильными EXIF на сервере. сторона (надеюсь, не делая этого на сервере). До сих пор мне удалось использовать ExifInterface
для чтения всех данных EXIF:
String path = ... //bitmap file path
ExifInterface exif = new ExifInterface(path);
... = exif.getAttribute(...)
РЕДАКТИРОВАТЬ: Оптимально, я хотел бы найти решение, которое не использует библиотеки. Если бы я мог просто получить индексы байтового массива исходного jpeg, которые содержат EXIF, и добавить/добавить эти байты в байтовый массив, созданный bitmap.compress(...)
это было бы лучше всего.
Ответы
Ответ 1
Благодаря @Nick Campion и Sanselan.
Рабочий код:
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!
}