2011-01-26 13 views
17

W systemie Android podczas dekodowania mapy bitowej ze zdjęcia w telefonie dane EXIF ​​w oryginale zostaną utracone. Wysyłam tę mapę bitową do mojego serwera przez gniazdo i chciałbym ponownie dołączyć brakujące dane EXIF ​​do wysyłanych danych.Jak dołączyć metadane EXIF ​​do serializowanej bitmapy w systemie Android?

mam jakiś kod, który ładuje obiekt Bitmap z Mediastore i spręża je do tablicy bajtów w ramach przygotowań do wysłania go na gnieździe:

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

chcę użyć ExifInterface dostać w EXIF metadane w oryginalnym jpeg na karcie SD i jakoś dodać to do wychodzącej tablicy bajtów w taki sposób, żebym mógł wyodrębnić jpeg z wszystkimi poprawnymi EXIF ​​po stronie serwera (miejmy nadzieję, bez robienia tego na serwerze). Do tej pory udało mi się użyć ExifInterface aby odczytać wszystkie dane EXIF:

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

EDIT: Optymalnie, chciałbym znaleźć rozwiązanie, które nie korzysta z bibliotek. Gdybym tylko mógł uzyskać indeksy tablicy bajtów oryginalnego jpeg, które zawierają EXIF ​​i poprzedzić/dołączyć te bajty do tablicy bajtów wyprodukowanych przez bitmap.compress(...), byłoby najlepiej.

+0

Czy uda się dodanie informacji EXIF ​​do tablicy bajtów? – Vikas

Odpowiedz

7

Dzięki @Nick Campion i Sanselan.

kod robocza:

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

Powyższy kod często nie działa zgodnie z oczekiwaniami w Sanselan Android. W szczególności, jeśli zmienisz rozmiar obrazu, powyższy kod nie tylko skopiuje metadane EXIF, ale również nadpisze dane obrazu, cofając zmiany rozmiaru. Wydaje się być problemem Sanselana, z którym spotkali się inni: http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E. Pisałem o obejściu tego problemu tutaj: http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

To działa dobrze ze mną. ale 'Sanselan' powinien wskazywać na https://commons.apache.org/proper/commons-imaging/, a' Sanselan.getMetadata' na 'Imaging.getMetadata' – Leon

Powiązane problemy