2008-09-12 15 views
61

Ich möchte ein kleines Programm in C# schreiben, die meine JPEG-Fotos durchläuft und zum Beispiel in datierte Ordner sortiert (mit MY Dating-Konventionen, verdammt ...).Wie bekomme ich die EXIF-Daten aus einer Datei mit C#

Kennt jemand einen relativ einfachen Weg, um die EXIF-Daten wie Datum und Uhrzeit oder Belichtung programmatisch zu bekommen? Danke!

+0

Die integrierte BCL-Unterstützung für Bildmetadaten ist sehr begrenzt. Ich arbeite seit 2002 mit Metadaten wie Exif und habe eine einfache, aber leistungsfähige [Bibliothek zum Extrahieren solcher Daten für .NET] (https://github.com/drewnoakes/metadata-extractor-dotnet). –

Antwort

3

Erste EXIF-Daten aus einem JPEG-Bild beinhaltet:

  1. auf den JPEG-Marker Sucht, das den Beginn der EXIF-Daten erwähnt ,. z.B. normalerweise ist oxFFE1 der Marker, der beim Codieren von EXIF-Daten eingefügt wird, was ein APPlication-Segment ist, wo EXIF-Daten gehen.
  2. Analysieren Sie alle Daten von sagen 0xFFE1 zu 0xFFE2. Diese Daten wären ein Bytestrom in der JPEG-codierten Datei.
  3. ASCII-Äquivalent dieses Bytes würde verschiedene Informationen im Zusammenhang mit Bild Datum, Kameramodellnamen, Belichtung etc ...
5

Bildklasse Property und PropertyIdList Eigenschaften enthält. Du kannst sie benutzen.

+0

Es scheint, es ist schreibgeschützt, so dass ich keine auf dem neuen Image hinzufügen kann ... – TigrouMeow

+3

Verwenden Sie die Image.SetPropertyItem (PropertyItem) -Funktion auf das neue Bild. –

9

Überprüfen Sie diese metadata extractor. Es ist in Java geschrieben, wurde aber auch nach C# portiert. Ich habe die Java-Version verwendet, um ein kleines Dienstprogramm zu schreiben, um meine JPEG-Dateien basierend auf den Datums- und Modell-Tags umzubenennen. Sehr einfach zu bedienen.


EDITMetadaten-Extraktor unterstützt zu .NET. Es ist eine sehr schnelle und einfache Bibliothek für den Zugriff auf Metadaten von Bildern und Videos.

Es unterstützt Exif sowie IPTC, XMP und viele andere Arten von Metadaten aus Dateitypen wie 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); 

Es ist erhältlich über NuGet und code's on GitHub.

9

Hier ist ein Link zu einem anderen similar SO question, der eine Antwort auf diesen guten Artikel auf "Reading, writing and photo metadata" in .Net hat.

+0

Eine alternative Frage mit ** sehr guter Antwort ** [ist hier] (https://stackoverflow.com/q/10494796/2803565), die auf [ExifLib - Ein Fast Exif Data Extractor für .NET 2.0 +] zeigt (https : //www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0) –

40

Wie vorgeschlagen, können Sie einige 3rd-Party-Bibliothek verwenden, oder tun Sie es manuell (das ist nicht so viel Arbeit), aber die einfachste und am flexibelsten ist möglicherweise die integrierte Funktionalität in .NET zu verwenden. Mehr siehe:

ich sage "es die flexibelste ist", weil .NET nicht zu interpretieren, nicht versuchen, oder Koaleszieren Sie die Daten in irgendeiner Weise. Für jedes EXIF ​​erhalten Sie grundsätzlich ein Array von Bytes. Dies kann gut oder schlecht sein, abhängig davon, wie viel Kontrolle Sie tatsächlich wollen.

Auch sollte ich darauf hinweisen, dass die Eigenschaftsliste tatsächlich nicht direkt den EXIF-Werten entspricht. EXIF selbst wird in mehreren Tabellen mit überlappenden IDs gespeichert, aber .NET fügt alles in eine Liste ein und definiert die IDs einiger Elemente neu. Aber solange Sie sich nicht um die genauen EXIF-IDs kümmern, sollten Sie mit dem .NET-Mapping zurechtkommen.

+8

Zugriff auf Bitmap.PropertyItems erfordert das Lesen der gesamten Datei in Arbeitsspeicher. Wenn Sie ein Bitmap erstellen, auf PropertyItems zugreifen und nichts anderes tun, können Sie XPerf verwenden, um zu sehen, dass Ihre App auf die Image-Datei zugegriffen und alles im Speicher gelesen hat. Für meinen Computer kostet eine 3,4 MB-Datei> 700ms IO, nur um EXIF ​​über PropertyItems zu erhalten :(. – Tristan

+4

Im Vergleich liest Picasa's PhotoViewer nur 20 - 30k von jeder Datei, die er berührt. Diese Lese kostet nur ~ 25ms. Wow; Ich würde mich gerne mit dem Typen unterhalten, der das geschrieben hat. (Die Daten wurden gesammelt, indem PhotoViewer mit XPerf gestartet wurde.) – Tristan

+0

@Tristan: Nützliche Informationen, aber wie oft greifen Sie auf die Metadaten des Bildes zu, ohne das Bild selbst zu wollen "Ich bin mir sicher, dass es einige Fälle gibt, aber ich denke, im Fall der Mehrheit würde man das Bild anzeigen (oder anderweitig mit seinen Daten arbeiten) UND gleichzeitig seine Metadaten. – jrista

6

Sie können TagLib# verwenden, das von Anwendungen wie F-Spot verwendet wird. Neben Exif wird es eine gute Menge von Metadaten-Formaten für Bild, Audio und Video lesen.

Ich mag auch ExifUtils API, aber es ist fehlerhaft und ist nicht aktiv entwickelt.

3

Das Befehlszeilentool ExifTool by Phil Harvey arbeitet mit Dutzenden von Bildformaten - einschließlich zahlreicher proprietärer RAW-Formate - und kann eine Vielzahl von Metadatenformaten einschließlich EXIF, GPS, IPTC, XMP, JFIF bearbeiten.

Sehr einfach zu bedienen, leichte, beeindruckende Anwendung.

+0

ExifTool ist eine erstaunliche lib/tool, aber es ist in Perl geschrieben, so dass die Verwendung von C# beinhaltet einen externen Prozess zu starten. –