Come ottenere i dati EXIF ​​da un file usando C #

Mi piacerebbe scrivere un piccolo programma in C # che passi attraverso le mie foto jpeg e, per esempio, li metta in cartelle datate (usando MY dating convention, dammit …).

Qualcuno conosce un modo relativamente facile per ottenere dati EXIF ​​come Data e ora o Esposizione programmaticamente? Grazie!

Dai un’occhiata a questo estrattore di metadati . È scritto in Java ma è stato anche portato su C #. Ho usato la versione Java per scrivere una piccola utility per rinominare i miei file jpeg in base alla data e ai tag del modello. Molto facile da usare.


EDIT metadata-extractor supporta anche .NET. È una libreria molto veloce e semplice per accedere ai metadati da immagini e video.

Supporta pienamente Exif, così come IPTC, XMP e molti altri tipi di metadati da tipi di file tra cui 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().FirstOrDefault(); var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime); 

È disponibile tramite NuGet e il codice è su GitHub .

Come suggerito, è ansible utilizzare alcune librerie di terze parti, o farlo manualmente (che non è tanto lavoro), ma il più semplice e flessibile è forse utilizzare la funzionalità integrata in .NET. Per ulteriori vedere:

  • Proprietà System.Drawing.Image.PropertyItems

  • Classe System.Drawing.Imaging.PropertyItem

  • Come: leggere i metadati delle immagini

Dico “è il più flessibile” perché .NET non tenta di interpretare o coalizzare i dati in alcun modo. Praticamente per ogni EXIF ​​ottieni una matrice di byte. Questo può essere buono o cattivo a seconda di quanto controllo tu voglia realmente.

Inoltre, vorrei sottolineare che l’elenco delle proprietà non corrisponde in realtà direttamente ai valori EXIF. EXIF stesso è memorizzato in più tabelle con ID sovrapposti, ma .NET mette tutto in una lista e ridefinisce gli ID di alcuni elementi. Ma fino a quando non ti interessa l’ID EXIF ​​preciso, dovresti stare bene con la mapping .NET.

Ecco un link a un’altra domanda SO simile , che ha una risposta che punta a questo buon articolo su “Reading, writing and photo metadata” in .Net.

È ansible utilizzare TagLib # che viene utilizzato da applicazioni come F-Spot . Oltre a Exif, leggerà una buona quantità di formati di metadati per immagini, audio e video.

Mi piace anche l’API ExifUtils ma è bacato e non è sviluppato triggersmente.

La class immagine ha proprietà PropertyItems e PropertyIdList. Puoi usarli

Lo strumento da riga di comando ExifTool di Phil Harvey funziona con dozzine di formati di immagini, tra cui numerosi formati RAW proprietari, e può manipolare una varietà di formati di metadati tra cui EXIF, GPS, IPTC, XMP, JFIF.

Applicazione molto facile da usare, leggera e impressionante.

Ottenere i dati EXIF ​​da un’immagine JPEG comporta:

  1. Cercando i marcatori JPEG che menzionano l’inizio dei dati EXIF ​​,. ad es. normalmente oxFFE1 è il marcatore inserito durante la codifica dei dati EXIF, che è un segmento di APPIGAZIONE, dove vanno i dati EXIF.
  2. Analizza tutti i dati da dire 0xFFE1 a 0xFFE2. Questi dati sarebbero stream di byte, nel file con codifica JPEG.
  3. L’equivalente ASCII di questi byte conterrà varie informazioni relative a Data immagine, Nome modello videocamera, Esposizione ecc.