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!
c#
exif
photography
Joel in Gö
quelle
quelle
Antworten:
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 .
quelle
Orientation
In jedem Bild befindet sich ein Tag, das normalerweise eine magische Zahl ist, aber diese Bibliothek gibt Ihnen die Drehung an (dhRotate 180
oderRotate 90 CCW
).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:
System.Drawing.Image.PropertyItems- Eigenschaft
System.Drawing.Imaging.PropertyItem- Klasse
Gewusst wie: Lesen von Bildmetadaten
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
quelle
PropertyItems
ohne das ganze Bild zu ladenHier ist ein Link zu einer anderen ähnlichen SO-Frage , die eine Antwort auf diesen guten Artikel über "Lesen, Schreiben und Fotometadaten" in .Net enthält.
quelle
Sie können TagLib # verwenden, das von Anwendungen wie F-Spot verwendet wird . Neben Exif werden zahlreiche Metadatenformate für Bild, Audio und Video gelesen.
Ich mag auch die ExifUtils- API, aber sie ist fehlerhaft und wird nicht aktiv entwickelt.
quelle
Die Bildklasse verfügt über die Eigenschaften PropertyItems und PropertyIdList. Sie können sie verwenden.
quelle
Das Abrufen von EXIF-Daten aus einem JPEG-Bild umfasst Folgendes:
quelle
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.
quelle
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); } }
quelle