2011-01-26 14 views
17

Android'de, telefondaki bir fotoğraftaki Bitmap'in kodunu çözerken, orijinaldeki EXIF ​​verileri kaybolur. Bu Bitmap'i bir soket aracılığıyla sunucuma gönderiyorum ve eksik EXIF ​​verilerini gönderilmekte olan verilere yeniden eklemek istiyorum.Android'de seri hale getirilmiş bir Bitmap'e EXIF ​​meta verileri nasıl eklenir?

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

Ben EXIF ​​ulaşmak için ExifInterface kullanmak istiyorum:

Ben Mediastore bir Bitmap nesnesi yükleyen ve bir soket üzerinden göndermek için hazırlık için bir bayt dizisi sıkıştırır bazı kod var SD karttaki orijinal jpeg'deki meta veriler ve bir şekilde sunucu tarafındaki tüm doğru EXIF'lerle bir jpeg çıkarabilmem için giden bayt dizisine bunu ekleyelim (umarız bu sunucuda bunu yapmadan). Hiçbir kütüphaneleri kullanan bir çözüm bulmak için Optimal, İsterdim:

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

DÜZENLEME: Şimdiye kadar, bütün EXIF ​​verilerini okumak için ExifInterface kullanmayı başardı. EXIF içeren orijinal jpeg'in bayt dizisinin indislerini alabildiysem ve bu baytları bitmap.compress(...) tarafından üretilen bayt dizisine en iyi olacak şekilde ekler/ekler.

+0

Eğer bayt dizisine exif bilgisi eklemenin başarılı oldu mu? – Vikas

cevap

7

@Nick Campion ve Sanselan aracılığıyla.

Çalışma kodu:

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

Yukarıdaki kod Sanselan Android ile beklendiği gibi çalışmaz. Özellikle, resmi yeniden boyutlandırırsanız, yukarıdaki kod yalnızca EXIF ​​meta verilerini kopyalamayacak, aynı zamanda resim verilerinizin üzerine yazarak yeniden boyutlandırmayı iptal edecektir. Başkalarının karşılaştığı bir Sanselan sorunu gibi görünüyor: http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E. Bu sorun için bir çözüm hakkında yazdım: http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

Benimle iyi çalışıyor. ama Sanselan'ın https://commons.apache.org/proper/commons-imaging/ adresine işaret etmesi ve Sanselan.getMetadata'nın "Imaging.getMetadata" olması gerekir. – Leon

İlgili konular