So erhalten Sie die EXIF-Daten aus einer Datei mit C #


77

Ich möchte ein kleines Programm in C # schreiben, das meine JPEG-Fotos durchläuft und sie beispielsweise in datierte Ordner sortiert (unter Verwendung MEINER Datierungskonventionen, verdammt ...).

Kennt jemand eine relativ einfache Möglichkeit, programmgesteuert auf EXIF-Daten wie Datum und Uhrzeit oder Belichtung zuzugreifen? Vielen Dank!


Die integrierte Unterstützung der BCL für Bildmetadaten ist sehr begrenzt. Ich arbeite seit 2002 mit Metadaten wie Exif und habe eine einfache, aber leistungsstarke Bibliothek zum Extrahieren solcher Daten für .NET .
Drew Noakes

1
Warum war das geschlossen? Es konzentriert sich auf ein Problem, das Beenden von EXIT aus Dateien. Es gibt auch eine klare und zielgerichtete Antwort.
Mafu

Antworten:


23

Schauen Sie sich diesen Metadatenextraktor an . Es ist in Java geschrieben, wurde aber auch nach C # portiert. Ich habe die Java-Version verwendet, um ein kleines Dienstprogramm zum Umbenennen meiner JPEG-Dateien basierend auf den Datums- und Modell-Tags zu schreiben. Sehr einfach zu bedienen.


EDIT Metadata-Extractor unterstützt auch .NET. Es ist eine sehr schnelle und einfache Bibliothek für den Zugriff auf Metadaten aus 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 über NuGet und den Code auf GitHub verfügbar .


Dies ist ideal, wenn Ihre Windows-App iPhone-Bilder immer seitlich oder verkehrt herum anzeigt. OrientationIn jedem Bild befindet sich ein Tag, das normalerweise eine magische Zahl ist, aber diese Bibliothek gibt Ihnen die Drehung an (dh Rotate 180oder Rotate 90 CCW).
Chris Akridge

47

Wie vorgeschlagen, können Sie eine Bibliothek eines Drittanbieters verwenden oder manuell (was nicht so viel Arbeit ist). Am einfachsten und flexibelsten ist es jedoch, möglicherweise die in .NET integrierte Funktionalität zu verwenden. Weitere Informationen finden Sie unter:

Ich sage "es ist das flexibelste", weil .NET nicht versucht, die Daten in irgendeiner Weise zu interpretieren oder zusammenzuführen. Für jedes EXIF ​​erhalten Sie grundsätzlich ein Array von Bytes. Dies kann gut oder schlecht sein, je nachdem, wie viel Kontrolle Sie tatsächlich wünschen.

Ich möchte auch 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. Solange Sie sich nicht für die genauen EXIF-IDs interessieren, sollten Sie mit der .NET-Zuordnung einverstanden sein.


Bearbeiten: Es ist möglich, dies zu tun, ohne das vollständige Bild nach dieser Antwort zu laden: https://stackoverflow.com/a/552642/2097240


9
Für den Zugriff auf Bitmap.PropertyItems muss die gesamte Datei in den Speicher eingelesen werden. Wenn Sie eine Bitmap erstellen, auf PropertyItems zugreifen und nichts anderes tun, können Sie mit XPerf feststellen, dass Ihre App auf die Bilddatei zugegriffen und alles in den Speicher eingelesen hat. Für meinen Computer kostete eine 3,4-MB-Datei E / A im Wert von> 700 ms, nur um EXIF ​​über PropertyItems zu erhalten :(.
Tristan

4
Im Vergleich dazu liest Picasas PhotoViewer nur 20 bis 30.000 aus jeder Datei, die er berührt. Diese Lesevorgänge kosten nur ~ 25ms. Beeindruckend; Ich würde gerne mit dem Mann / Mädchen plaudern, der das Zeug geschrieben hat. (Die Daten wurden durch Profilierung des Starts von PhotoViewer mit XPerf erfasst.)
Tristan

@Tristan: Nützliche Informationen, aber wie oft greifen Sie auf die Bildmetadaten zu, ohne auch das Bild selbst zu wollen? Ich bin mir sicher, dass es einige Fälle gibt, aber ich denke, in den meisten Fällen würde man das Bild anzeigen (oder auf andere Weise mit seinen Daten arbeiten) UND gleichzeitig seine Metadaten.
jrista

5
@jrista Wie oft möchte ich nur die Metadaten? Meistens. Stellen Sie sich beispielsweise vor, Sie möchten eine Reihe von Bildern nach Metadaten sortieren oder filtern. Das Sortieren nach Aufnahmedatum ist eine ziemlich häufige Aufgabe, und um diese Informationen zu erhalten, müssen Sie in die Metadaten gehen.
Tristan

1
Diese Antwort zeigt, wie es geht, PropertyItems ohne das ganze Bild zu laden
Daniel Möller



5

Die Bildklasse verfügt über die Eigenschaften PropertyItems und PropertyIdList. Sie können sie verwenden.


Es scheint schreibgeschützt zu sein, daher kann ich dem neuen Bild keine hinzufügen ...
TigrouMeow

3
Verwenden Sie die Funktion Image.SetPropertyItem (PropertyItem) für das neue Bild.
Morten Christiansen

4

Das Abrufen von EXIF-Daten aus einem JPEG-Bild umfasst Folgendes:

  1. Ich suche nach den JPEG-Markern, die den Beginn der EXIF-Daten erwähnen. zB normalerweise ist oxFFE1 der Marker, der beim Codieren von EXIF-Daten eingefügt wird. Dies ist ein Anwendungssegment, in das EXIF-Daten gehen.
  2. Analysieren Sie alle Daten von beispielsweise 0xFFE1 bis 0xFFE2. Diese Daten wären ein Bytestrom in der JPEG-codierten Datei.
  3. Das ASCII-Äquivalent dieser Bytes würde verschiedene Informationen enthalten, die sich auf das Bilddatum, den Namen des Kameramodells, die Belichtung usw. beziehen.

3

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

Sehr einfach zu bedienende, leichte und beeindruckende Anwendung.


1
ExifTool ist eine erstaunliche Bibliothek / ein erstaunliches Tool, das jedoch in Perl geschrieben ist. Wenn Sie es also aus C # verwenden, müssen Sie einen externen Prozess starten.
Drew Noakes

0

Kürzlich habe ich diese .NET-Metadaten-API verwendet . Ich habe auch einen Blog-Beitrag darüber geschrieben, der das Lesen, Aktualisieren und Entfernen der EXIF-Daten aus Bildern mit C # zeigt.

using (Metadata metadata = new Metadata("image.jpg"))
{
    IExif root = metadata.GetRootPackage() as IExif;
    if (root != null && root.ExifPackage != null)
    {
        Console.WriteLine(root.ExifPackage.DateTime);
     }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.