Подтвердить что ты не робот

Как подключить метаданные 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(...) это было бы лучше всего.

4b9b3361

Ответ 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!
}