2008-09-12 12 views
61

का उपयोग कर फ़ाइल से EXIF ​​डेटा कैसे प्राप्त करें मैं सी # में एक छोटा प्रोग्राम लिखना चाहता हूं जो मेरी जेपीईजी तस्वीरों के माध्यम से जाता है और, उदाहरण के लिए, उन्हें दिनांकित फ़ोल्डर्स में टाइप करता है (मेरे डेटिंग सम्मेलनों का उपयोग करके, ...)।सी #

क्या किसी को भी समय और समय या एक्सपोजर जैसे EXIF ​​डेटा प्राप्त करने के लिए अपेक्षाकृत आसान तरीका पता है? धन्यवाद!

+0

छवि मेटाडेटा के लिए बीसीएल का अंतर्निहित समर्थन काफी सीमित है। मैं 2002 से Exif जैसे मेटाडेटा के साथ काम कर रहा हूं और इसमें एक सरल लेकिन शक्तिशाली [.NET] के लिए ऐसे डेटा निकालने के लिए लाइब्रेरी है (https://github.com/drewnoakes/metadata-extractor-dotnet)। –

उत्तर

3

एक JPEG छवि से EXIF ​​डेटा हो रही शामिल है:

  1. जेपीईजी मार्करों जो EXIF ​​डेटा की शुरुआत का उल्लेख करने के लिए की तलाश ,. जैसे आमतौर पर ऑक्सएफएफई 1 एक्सआईएफ डेटा एन्कोड करते समय मार्कर डाला जाता है, जो एक एपिलिकेशन सेगमेंट है, जहां EXIF ​​डेटा जाता है।
  2. 0xFFE1 से 0xFFE2 कहने से सभी डेटा पार्स करें। जेपीईजी एन्कोडेड फ़ाइल में यह डेटा बाइट्स की धारा होगी।
  3. इन बाइट्स की ASCII बराबर चित्र दिनांक, कैमरा मॉडल का नाम, एक्सपोजर आदि से संबंधित विभिन्न जानकारी हो जाएगा ...
5

छवि वर्ग PropertyItems और PropertyIdList गुण है। आप उनका उपयोग कर सकते हैं।

+0

ऐसा लगता है कि यह केवल पढ़ने के लिए है, इसलिए मैं नई छवि पर कोई भी जोड़ नहीं सकता ... – TigrouMeow

+3

नई छवि पर Image.SetPropertyItem (PropertyItem) फ़ंक्शन का उपयोग करें। –

9

यह metadata extractor देखें। यह जावा में लिखा गया है लेकिन इसे सी # पर भी पोर्ट किया गया है। मैंने जावा संस्करण का उपयोग दिनांक और मॉडल टैग के आधार पर मेरी जेपीईजी फाइलों का नाम बदलने के लिए एक छोटी उपयोगिता लिखने के लिए किया है। उपयोग करने के लिए बहुत आसान है।


संपादितमेटाडाटा-निकालने नेट भी समर्थन करता है। छवियों और वीडियो से मेटाडेटा तक पहुंचने के लिए यह एक बहुत तेज और सरल लाइब्रेरी है।

यह पूरी तरह से Exif, साथ ही आईपीटीसी, XMP और JPEG, PNG, GIF, PNG, ICO, WebP, PSD, सहित फ़ाइल प्रकारों से मेटाडाटा के कई अन्य प्रकार के ...

var directories = ImageMetadataReader.ReadMetadata(imagePath); 

// print out all metadata 
foreach (var directory in directories) 
foreach (var tag in directory.Tags) 
    Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}"); 

// access the date time 
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime); 

यह समर्थन करता है NuGet और code's on GitHub के माध्यम से उपलब्ध है।

9

यहां अन्य similar SO question का एक लिंक है, जिसका उत्तर "Reading, writing and photo metadata" पर इस अच्छे आलेख को इंगित करने का उत्तर है।

+0

** बहुत अच्छा उत्तर ** [यहां है] के साथ एक वैकल्पिक प्रश्न [https://stackoverflow.com/q/10494796/2803565) जो इंगित करता है [ExifLib - .NET 2.0 + के लिए एक फास्ट एक्सिफ़ डेटा एक्स्ट्रैक्टर (https : //www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0) –

40

जैसा कि सुझाव दिया गया है, आप कुछ तृतीय पक्ष लाइब्रेरी का उपयोग कर सकते हैं, या इसे मैन्युअल रूप से कर सकते हैं (जो इतना अधिक काम नहीं है), लेकिन सबसे आसान और सबसे लचीला शायद .NET में अंतर्निहित कार्यक्षमता का उपयोग करना है। और अधिक देखने के लिए:

मैं कहता हूँ "यह सबसे लचीला है" क्योंकि नेट व्याख्या करने के लिए या कोशिश नहीं करता किसी भी तरह से डेटा coalesce। प्रत्येक EXIF ​​के लिए आपको मूल रूप से बाइट्स की एक सरणी मिलती है। यह वास्तव में कितना नियंत्रण चाहते हैं इस पर निर्भर करता है कि यह अच्छा या बुरा हो सकता है।

इसके अलावा, मुझे यह इंगित करना चाहिए कि संपत्ति सूची वास्तव में EXIF ​​मानों से सीधे मेल नहीं खाती है। EXIF स्वयं को ओवरलैपिंग आईडी के साथ कई तालिकाओं में संग्रहीत किया जाता है, लेकिन .NET सबकुछ एक सूची में रखता है और कुछ आइटमों के आईडी को फिर से परिभाषित करता है। लेकिन जब तक आप सटीक EXIF ​​आईडी की परवाह नहीं करते हैं, तो आपको .NET मैपिंग के साथ ठीक होना चाहिए।

+8

बिटमैप एक्सेस करना। प्रॉपर्टी इटम्स को पूरी फ़ाइल को स्मृति में पढ़ने की आवश्यकता है। यदि आप बिटमैप बनाते हैं, तो PropertyItems तक पहुंचें और कुछ और नहीं करें, आप यह देखने के लिए XPerf का उपयोग कर सकते हैं कि आपके ऐप ने छवि फ़ाइल तक पहुंचा है और इसे सभी को स्मृति में पढ़ा है। मेरे कंप्यूटर के लिए, 3.4 एमबी फ़ाइल लागत> 700 एमएम मूल्य आईओ, सिर्फ संपत्ति के माध्यम से EXIF ​​प्राप्त करने के लिए :( – Tristan

+4

तुलनात्मक रूप से, पिकासा का फोटोव्यूअर प्रत्येक फ़ाइल से केवल 20 - 30k पढ़ता है। जो लागत केवल ~ 25ms पढ़ता है। वाह; मुझे उस सामान को लिखने वाले लड़के/लड़की से चैट करना अच्छा लगेगा। (XPerf का उपयोग करके फोटोवियर के स्टार्टअप को प्रोफाइल करके डेटा एकत्र किया गया था)। – Tristan

+0

@ ट्रिस्टन: उपयोगी जानकारी, हालांकि आप छवि मेटाडेटा को कितनी बार छवि के बिना ? मुझे यकीन है कि कुछ मामले हैं, लेकिन मुझे लगता है कि बहुमत के मामले में, कोई छवि प्रदर्शित करेगा (या अन्यथा इसके डेटा के साथ काम कर रहा है) और यह एक ही समय में मेटाडेटा है। – jrista

6

आप TagLib# का उपयोग कर सकते हैं जिसका उपयोग F-Spot जैसे अनुप्रयोगों द्वारा किया जाता है। Exif के अलावा, यह छवि, ऑडियो और वीडियो के लिए मेटाडाटा प्रारूपों की एक अच्छी राशि पढ़ेगा।

मुझे ExifUtils एपीआई भी पसंद है लेकिन यह छोटी है और सक्रिय रूप से विकसित नहीं है।

3

कमांड लाइन उपकरण ExifTool by Phil Harvey दर्जनों छवि प्रारूपों के साथ काम करता है - जिसमें मालिकाना रॉ प्रारूपों के बहुत सारे शामिल हैं - और EXIF, GPS, IPTC, XMP, JFIF सहित विभिन्न मेटाडेटा प्रारूपों में हेरफेर कर सकते हैं।

उपयोग करने में बहुत आसान, हल्के, प्रभावशाली अनुप्रयोग।

+0

ExifTool एक अद्भुत lib/टूल है, लेकिन यह पर्ल में लिखा गया है, इसलिए इसे सी # से उपयोग करने से बाहरी प्रक्रिया लॉन्च करना शामिल है। –