2011-01-04 14 views
5

मैं बहुत की तरह एक निजी निर्देशिका के लिए एक छवि को कॉपी कर रहा हूँ:एक छवि प्रतिलिपि बनाई जा रही, Exif डेटा खो देता है

FileChannel source = null; 
FileChannel destination = null; 
source = new FileInputStream(sourceFile).getChannel(); 
destination = new FileOutputStream(destFile).getChannel(); 
destination.transferFrom(source, 0, source.size()); 
source.close(); 
destination.close(); 

..लेकिन जब मैं यह गैलरी, में वापस डालने अछूता, बाद में:

private void moveImageToGallery(Uri inUri) throws Exception { 
    MediaStore.Images.Media.insertImage(getContentResolver(), ImageUtil.loadFullBitmap(inUri.getPath()), null, null); 
} 

.. यह स्पष्ट रूप से अपने Exif डेटा खो देता है। घूर्णन अब काम नहीं करता है। क्या कोई तरीका है कि मैं एक छवि फ़ाइल की प्रतिलिपि बना सकता हूं और उस डेटा को खो नहीं सकता? किसी भी सुझाव के लिए धन्यवाद।

+0

गूगल एंड्रॉयड समूह के माध्यम से Purusing मुझे विश्वास को यह एक OS मुद्दा है, एक देव ने कहा, "एक वैध सुविधा का अनुरोध की तरह लगता है"। –

+1

यह कठिन है कि ऐसा करने का कोई अच्छा तरीका नहीं है। आप फ़ाइल को कॉपी करने के बाद क्या कर सकते हैं, और इसे सम्मिलित करने से पहले, उन गुणों को जोड़ने के लिए ExifInterface का उपयोग करें जिन्हें आप छवि डेटाबेस से पढ़ सकते हैं जैसे रोटेशन, लेट/लांग, और तिथि। फिर जब आप छवि डालते हैं, तो उन्हें सही ढंग से पढ़ना चाहिए और उन्हें नई डेटाबेस प्रविष्टि में जोड़ना चाहिए। वाह, बस एहसास हुआ कि यह 2 साल का है! मुझे यकीन है कि आप पहले से ही ऐसा कुछ कर चुके हैं, लेकिन मेरा जवाब यहां छोड़ देंगे। निश्चित नहीं है कि यह एंड्रॉइड प्रश्न सूची के शीर्ष पर क्यों था। –

उत्तर

2

फ़ाइलChannel, वास्तव में, डेटा को पढ़ने, इसे डीकोड करने, इसे फिर से जांचने के लिए प्रतीत होता है, फिर इसे लिखें; इस प्रकार EXIF ​​डेटा खोना। एक फ़ाइल की प्रतिलिपि बनाना (बाइट-बाय-बाइट) इसकी सामग्री को परिवर्तित नहीं करता है। प्रतिलिपि के पहले/बाद में होने वाली एकमात्र चीज फ़ाइल एक्सेस चेंज है (याद रखें: एंड्रॉइड लिनक्स पर आधारित है, लिनक्स एक यूनिक्स => आरडब्ल्यूएक्स अनुमतियां (देखें chmod)), अंत में फ़ाइल को पढ़ने या लिखने से इंकार कर रहा है। तो यह स्पष्ट है कि FileChannel कुछ अवांछित करता है।

इस कोड काम करेंगे:

InputStream in = new FileInputStream(source); 
OutputStream out = new FileOutputStream(dest); 
byte[] buf = new byte[1024]; int len; 
while ((len = in.read(buf)) > 0) 
    out.write(buf, 0, len); 
in.close(); 
out.close(); 
+0

मैं इसे आज़मा दूंगा। मुझे लगता है कि गैलरी से फ़ोटो में हेरफेर करते समय आपको एंड्रॉइड के "चैनल" से गुज़रना पड़ता था, लेकिन ऐसा लगता है कि यह मामला नहीं है, यह सिर्फ एक मुफ़्त है। –

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