81 votes

Comment obtenir les données EXIF d'un fichier en utilisant C#

Je voudrais écrire un petit programme en C# qui parcourt mes photos jpeg et, par exemple, les classe dans des dossiers datés (en utilisant MES conventions de datation, bon sang...).

Quelqu'un connaît-il un moyen relativement facile d'obtenir les données EXIF telles que la date et l'heure ou l'exposition par programme ? Merci !

0 votes

Le support intégré de la BCL pour les métadonnées d'image est assez limité. Je travaille avec des métadonnées telles qu'Exif depuis 2002 et j'ai une méthode simple mais puissante pour gérer les métadonnées. bibliothèque d'extraction de ces données pour .NET .

2 votes

Pourquoi cela a-t-il été fermé ? Il se concentre sur un problème, l'obtention de EXIT à partir de fichiers. Il y a aussi une réponse claire et précise.

54voto

Jan Zich Points 5701

Comme suggéré, vous pouvez utiliser une bibliothèque tierce ou le faire manuellement (ce qui ne représente pas un travail considérable), mais le plus simple et le plus flexible est peut-être d'utiliser la fonctionnalité intégrée à .NET. Pour en savoir plus, voir :

Je dis "c'est le plus flexible" parce que .NET n'essaie pas d'interpréter ou de fusionner les données de quelque manière que ce soit. Pour chaque EXIF, vous obtenez essentiellement un tableau d'octets. Cela peut être bon ou mauvais selon le degré de contrôle que vous souhaitez réellement.

Par ailleurs, je tiens à préciser que la liste des propriétés ne correspond pas directement aux valeurs EXIF. EXIF lui-même est stocké dans plusieurs tables avec des ID qui se chevauchent, mais .NET met tout dans une liste et redéfinit les ID de certains éléments. Mais tant que vous ne vous souciez pas des ID EXIF précis, le mappage .NET devrait vous convenir.


Edit : Il est possible de le faire sans charger l'image complète en suivant cette réponse : https://stackoverflow.com/a/552642/2097240

10 votes

L'accès à Bitmap.PropertyItems nécessite la lecture de l'ensemble du fichier en mémoire. Si vous créez un Bitmap, accédez à PropertyItems et ne faites rien d'autre, vous pouvez utiliser XPerf pour voir que votre application a accédé au fichier image et a tout lu en mémoire. Sur mon ordinateur, un fichier de 3,4 mégaoctets a coûté plus de 700 ms d'E/S, juste pour obtenir les données EXIF via PropertyItems :(.

4 votes

En comparaison, la visionneuse de photos de Picasa ne lit que 20 à 30 kilos de chaque fichier qu'elle touche. Ces lectures ne coûtent que ~25 ms. J'aimerais bien discuter avec le gars ou la fille qui a écrit ce truc. (Les données ont été recueillies en profilant le démarrage de PhotoViewer à l'aide de XPerf).

0 votes

@Tristan : Informations utiles, mais combien de fois accédez-vous aux métadonnées de l'image sans vouloir également l'image elle-même ? Je suis sûr qu'il y a des cas, mais je pense que dans la majorité des cas, on affiche l'image (ou on travaille avec ses données) ET ses métadonnées en même temps.

27voto

Dave Griffiths Points 688

Regarde ça extracteur de métadonnées . Il est écrit en Java mais a également été porté en C#. J'ai utilisé la version Java pour écrire un petit utilitaire permettant de renommer mes fichiers jpeg en fonction des balises de date et de modèle. Très facile à utiliser.


EDITAR extracteur de métadonnées supporte également .NET. Il s'agit d'une bibliothèque très rapide et simple pour accéder aux métadonnées des images et des vidéos.

Il prend entièrement en charge Exif, ainsi que IPTC, XMP et de nombreux autres types de métadonnées à partir de types de fichiers tels que 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);

Il est disponible via NuGet y el Le code est sur GitHub .

0 votes

C'est idéal si votre application Windows affiche toujours les images de l'iPhone de travers ou à l'envers. Il y a une Orientation dans chaque image qui est habituellement un nombre magique, mais cette bibliothèque vous indique la rotation (i.e. Rotate 180 o Rotate 90 CCW ).

10voto

smola Points 433

Vous pouvez utiliser TagLib# qui est utilisé par des applications telles que Point F . Outre Exif, il lit un grand nombre de formats de métadonnées pour l'image, l'audio et la vidéo.

J'aime aussi ExifUtils mais elle est boguée et n'est pas activement développée.

9voto

Joel in Gö Points 3195

Voici un lien vers un autre question similaire sur le SO qui a une réponse pointant vers ce bon article sur le site de la Commission européenne. "Lecture, écriture et métadonnées des photos" en .Net.

0 votes

Une autre question avec très bonne réponse est ici qui pointe vers ExifLib - Un extracteur de données Exif rapide pour .NET 2.0+.

6voto

idursun Points 3648

La classe Image possède des propriétés PropertyItems et PropertyIdList. Vous pouvez les utiliser.

0 votes

Il semble que ce soit en lecture seule, donc je ne peux pas en ajouter sur la nouvelle image...

3 votes

Utilisez la fonction Image.SetPropertyItem(PropertyItem) sur la nouvelle image.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X