Как прикрепить метаданные EXIF ​​к сериализованному растровому изображению в Android? - PullRequest
17 голосов
/ 26 января 2011

В Android при декодировании растрового изображения из фотографии на телефоне данные EXIF ​​в оригинале теряются.Я отправляю это растровое изображение на свой сервер через сокет и хочу повторно присоединить отсутствующие данные EXIF ​​к отправляемым данным.

У меня есть код, который загружает растровый объект из 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 Ответ

7 голосов
/ 11 мая 2011

Благодаря @ Ника Кэмпиону и Санселану .

Рабочий код:

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!
}
...