2011-01-26 7 views
17

एंड्रॉइड में, फोन पर एक फोटो से बिटमैप को डीकोड करते समय, मूल में EXIF ​​डेटा खो जाता है। मैं इस बिटमैप को अपने सॉकेट के माध्यम से अपने सर्वर पर भेज रहा हूं और लापता EXIF ​​डेटा को भेजे जा रहे डेटा को दोबारा जोड़ना चाहता हूं।एंड्रॉइड में एक धारावाहिक बिटमैप को EXIF ​​मेटाडेटा कैसे संलग्न करें?

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

मैं ExifInterface उपयोग करने के लिए EXIF ​​पर प्राप्त करना चाहते हैं:

मैं कुछ कोड है कि Mediastore से एक बिटमैप वस्तु लोड करता है और तैयार करने में एक बाइट सरणी के लिए यह संपीड़ित करता है एक सॉकेट पर भेज दिया एसडी कार्ड पर मूल जेपीईजी में मेटाडेटा और किसी भी तरह से आउटगोइंग बाइट सरणी में इस तरह से जोड़ें कि मैं सर्वर पक्ष पर सभी सही EXIF ​​के साथ एक जेपीईजी निकालने में सक्षम हूं (उम्मीद है कि सर्वर पर ऐसा किए बिना)।

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

संपादित करें: बेहतर, मैं चाहता हूँ एक समाधान नहीं पुस्तकालयों का उपयोग करता है खोजने के लिए अब तक, मैं ExifInterface उपयोग करने के लिए सभी EXIF ​​डेटा को पढ़ने में कामयाब रहे। अगर मैं मूल जेपीईजी के बाइट सरणी के सूचकांक प्राप्त कर सकता हूं जिसमें EXIF ​​शामिल है और bitmap.compress(...) द्वारा उत्पादित बाइट सरणी में इन बाइट्स को प्रीपेन्ड/संलग्न करें जो सबसे अच्छा होगा।

+0

आप बाइट सरणी exif जानकारी जोड़ने के साथ सफल किया? – Vikas

उत्तर

7

@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! 
} 
+0

उपरोक्त कोड अक्सर सैंसेलन एंड्रॉइड के साथ अपेक्षित काम नहीं करता है। विशेष रूप से, यदि आप छवि का आकार बदलते हैं, तो उपरोक्त कोड केवल EXIF ​​मेटाडेटा की प्रतिलिपि नहीं करेगा बल्कि आकार बदलने के पूर्ववत होने पर आपके छवि डेटा को ओवरराइट करेगा। लगता है कि एक संसलन मुद्दा दूसरों के सामने आया है: http://mail-archives.apache.org/mod_mbox/commons-user/201103.mbox/%[email protected]%3E। मैंने यहां इस समस्या के लिए एक समाधान के बारे में लिखा: http://bricolsoftconsulting.com/2012/12/08/copying-exif-metadata-using-sanselan/ – Theo

+0

यह मेरे साथ ठीक काम करता है। लेकिन 'संसानन' को https://commons.apache.org/proper/commons-imaging/ और 'Sanselan.getMetadata' को इंगित करना चाहिए 'Imaging.getMetadata' – Leon

संबंधित मुद्दे