2012-11-28 21 views
38

यदि आपका एंड्रॉइड ऐप डिवाइस लेने के लिए डिवाइस कैमरा का उपयोग करता है और फिर इसका आकार बदलता है (अपलोड के आकार को कम करने के लिए यह बहुत आम है), तो हो सकता है कि आप यह एहसास नहीं है कि यह आकार बदलने का ऑपरेशन स्ट्रिप्स exif मेटाडाटा।एंड्रॉइड छवि EXIF ​​डेटा का आकार बदलना और संरक्षित करना (अभिविन्यास, रोटेशन इत्यादि)

इससे समस्याएं पैदा हो सकती हैं, खासकर यदि प्रश्न में डिवाइस 'ओरिएंटेशन' टैग पर निर्भर करता है ताकि छवि को सही तरीके से दिखाया जा सके।

विभिन्न एंड्रॉइड डिवाइस अलग-अलग तरीकों से कैमरा/छवि रोटेशन को संभालते हैं - मेरा भरोसेमंद ओल 'नेक्सस वन हमेशा कैप्चर पोस्ट करने के बाद छवि को घुमाता प्रतीत होता है, इसलिए फ़ाइल की मूल सामग्री हमेशा देखी जाने पर' सीधे 'होती है। हालांकि अन्य उपकरणों (विशेष रूप से मेरे परीक्षण में सैमसंग फोन), छवि फ़ाइल की सामग्री को घुमाएं - बल्कि, वे exif 'Orientation' टैग सेट करते हैं। जब भी छवि बाद में प्रदर्शित होती है, प्रासंगिक छवि कोड को अभिविन्यास 'टैग' की उपस्थिति का पता लगाना चाहिए और छवि को उचित रूप से घुमाएं। लेकिन अगर आपने छवि पर कोई बिटमैप प्रोसेसिंग किया है और इसे एक नई फाइल में सहेजा है, तो उस एक्सिफ डेटा का सब कुछ खो गया है।

अभिविन्यास डेटा के अलावा, आप भी अन्य मूल्यवान मेटाडाटा इस तरह/मॉडल के रूप में खो सकता है, आदि

यह मैं कुछ सप्ताह के लिए उलझन में (छवि ईमानदार प्रकट होता है जब फोन गैलरी में प्रदर्शित है, लेकिन फिर पर आता है खराब सर्वर के साथ मेरा सर्वर और कोई स्पष्ट मेटाडाटा)। मैं दूसरों की मदद के लिए यहां इस आत्म-प्रश्न को जोड़ रहा हूं। इस ब्लॉग पोस्ट काफी मददगार था:

http://vikaskanani.wordpress.com/2011/07/17/android-re-size-image-without-loosing-exif-information/

उत्तर

15

के रूप में दूसरों को संकेत दिया है, आप अंतिम आकार दिया छवि के लिए मूल छवि से EXIF ​​डेटा कॉपी करना होगा। Sanselan एंड्रॉइड लाइब्रेरी आमतौर पर इसके लिए सबसे अच्छा है। एंड्रॉइड ओएस संस्करण के आधार पर, ExifInterface कभी-कभी EXIF ​​डेटा को दूषित करता है। इसके अलावा, ExifInterface भी सीमित संख्या में Exif टैग को संभालता है - यानी केवल टैग जो इसे "जानता है" के बारे में बताता है। दूसरी ओर सैन्सेलन सभी EXIF ​​टैग और मार्कर नोट्स रखेगा। http://bricolsoftconsulting.com/copying-exif-metadata-using-sanselan/

Btw, Android पर मैं भी छवियों बारी बारी से और अभिविन्यास EXIF ​​टैग को निकालने के लिए करते हैं:

यहाँ एक ब्लॉग पोस्ट से पता चलता है कि छवि डेटा कॉपी करने के लिए Sanselan उपयोग करने के लिए कैसे है। उदाहरण के लिए, एंड्रॉइड 4.03 के साथ नेक्सस एस पर, कैमरा EXIF ​​मेटाडेटा में एक ओरिएंटेशन टैग सेट कर रहा था, लेकिन वेबव्यू उस जानकारी को अनदेखा कर रहा था और छवि को गलत तरीके से प्रदर्शित कर रहा था। अफसोस की बात है, वास्तविक छवि डेटा घूर्णन और EXIF ​​अभिविन्यास टैग को हटाने का एकमात्र तरीका है कि प्रत्येक प्रोग्राम छवियों को सही तरीके से प्रदर्शित करने का एकमात्र तरीका है।

+0

धन्यवाद थियो, मैं इस उत्तर की सराहना करता हूं और इसे स्वीकार कर चुका हूं। क्या आपके पास इस पर अधिक जानकारी के लिए एक लिंक है "एंड्रॉइड ओएस संस्करण के आधार पर, ExifInterface कभी-कभी EXIF ​​डेटा को दूषित करता है।" –

+0

यह मेरे अनुभव पर आधारित है, और मैं यह नहीं ढूंढने वाला पहला व्यक्ति हूं कि ExifInterface छोटी है [1]। आने वाले दिनों में मेरे पास कितना समय है, इस पर निर्भर करता हूं कि मैं कुछ चित्रकारी मामलों को एक साथ रख सकता हूं और वापस रिपोर्ट कर सकता हूं। [1] http://mail-archives.apache.org/mod_mbox/commons-issues/201106.mbox/%[email protected]e.org%3E – Theo

+0

@Theo i ' मैंने आपके कोड का परीक्षण किया है, और ऐसा लगता है कि कुछ उपकरणों और छवियों के लिए अधिकांश/सभी विशेषताओं की प्रतिलिपि बनाई गई है। उन गुणों के उदाहरण जो अच्छी तरह से कॉपी नहीं करते हैं: ISOSpeedRatings, FocalLength, FNumber। क्या आप कृपया समझा सकते हैं कि यह कैसे हो सकता है? मैंने एंड्रॉइड 4.4.2 के साथ एक नेक्सस 4 डिवाइस पर इसका परीक्षण किया है, और मूल फ़ाइल और नई फ़ाइल पर बनाए गए ExifInterface की तुलना की है। –

33

[स्वयं जवाब]

AFAICT, वहाँ है थोक में स्नैपशॉट जो कुछ भी नहीं है और हस्तांतरण स्वचालित रूप से या यहाँ तक कि मेटाडाटा लागू करने के लिए कोई तंत्र।

इसके बजाय, ऐसा लगता है कि आपको स्पष्ट रूप से विशिष्ट गुणों की जांच करनी चाहिए और उन्हें ExifInterface का उपयोग करके नई छवि फ़ाइल में कॉपी करना होगा।

http://developer.android.com/reference/android/media/ExifInterface.html

तो जैसे कुछ:

ExifInterface oldExif = new ExifInterface(oldImagePath); 
String exifOrientation = oldExif.getAttribute(ExifInterface.TAG_ORIENTATION); 

if (exifOrientation != null) { 
    ExifInterface newExif = new ExifInterface(imagePath); 
    newExif.setAttribute(ExifInterface.TAG_ORIENTATION, exifOrientation); 
    newExif.saveAttributes(); 
} 
+0

यह दोषरहित काम किया। धन्यवाद! – Mauker

22

आलसी लोगों के लिए, यहाँ एक पुन: प्रयोज्य समारोह है:

public static void copyExif(String oldPath, String newPath) throws IOException 
{ 
    ExifInterface oldExif = new ExifInterface(oldPath); 

    String[] attributes = new String[] 
    { 
      ExifInterface.TAG_APERTURE, 
      ExifInterface.TAG_DATETIME, 
      ExifInterface.TAG_DATETIME_DIGITIZED, 
      ExifInterface.TAG_EXPOSURE_TIME, 
      ExifInterface.TAG_FLASH, 
      ExifInterface.TAG_FOCAL_LENGTH, 
      ExifInterface.TAG_GPS_ALTITUDE, 
      ExifInterface.TAG_GPS_ALTITUDE_REF, 
      ExifInterface.TAG_GPS_DATESTAMP, 
      ExifInterface.TAG_GPS_LATITUDE, 
      ExifInterface.TAG_GPS_LATITUDE_REF, 
      ExifInterface.TAG_GPS_LONGITUDE, 
      ExifInterface.TAG_GPS_LONGITUDE_REF, 
      ExifInterface.TAG_GPS_PROCESSING_METHOD, 
      ExifInterface.TAG_GPS_TIMESTAMP, 
      ExifInterface.TAG_IMAGE_LENGTH, 
      ExifInterface.TAG_IMAGE_WIDTH, 
      ExifInterface.TAG_ISO, 
      ExifInterface.TAG_MAKE, 
      ExifInterface.TAG_MODEL, 
      ExifInterface.TAG_ORIENTATION, 
      ExifInterface.TAG_SUBSEC_TIME, 
      ExifInterface.TAG_SUBSEC_TIME_DIG, 
      ExifInterface.TAG_SUBSEC_TIME_ORIG, 
      ExifInterface.TAG_WHITE_BALANCE 
    }; 

    ExifInterface newExif = new ExifInterface(newPath); 
    for (int i = 0; i < attributes.length; i++) 
    { 
     String value = oldExif.getAttribute(attributes[i]); 
     if (value != null) 
      newExif.setAttribute(attributes[i], value); 
    } 
    newExif.saveAttributes(); 
} 
+4

यदि आकार बदलें, तो TAG_IMAGE_LENGTH और TAG_IMAGE_WIDTH की प्रतिलिपि बनाने या कॉपी न करने के लिए याद रखें –