IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Obtenir la date de prise de vue d'une photo


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Obtenir la date de prise de vue d'une photo
    Bonjour à tous,

    Voilà j'ai un petit programme qui me permet de gérer le tri des photos selon plusieurs critères (date de création, date de dernière modif, ...).

    Seulement, je voudrais pouvoir les trier également en fonction de leur date réelle de création (et non pas la date de création dans le système), je veux dire : la date de prise de vue.

    Je sais que dans les systèmes windows il est possible d'obtenir cette information. Seulement je ne sais pas comme la retrouver en C#.

    Existe t-il une dll spécifique qui pourrait me permettre de l'obtenir ?

    D'avance merci.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    il faut extraire les informations exif du fichier
    que tu sois en windows forms ou en wpf je crois qu'il y a ce qu'il faut

    donc cherche exif c# sur le net

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Avec GDI (System.Drawing, utilisé en Windows Forms) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
     
     
    ...
     
        Image img = Image.FromFile(path);
        PropertyItem propItem = img.GetPropertyItem(0x0132);
        string dateString = Encoding.ASCII.GetString(propItem.Value).TrimEnd('\0');
        DateTime date = DateTime.Parse(dateString);
    (0x0132 est l'identifiant de la date de prise de vue; cf. les specs EXIF pour les ID des autres propriétés)

    Avec WPF :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    using System;
    using System.Windows.Media.Imaging;
     
    ...
     
        BitmapFrame img = BitmapFrame.Create(new Uri(path));
        BitmapMetadata metadata = (BitmapMetadata)img.Metadata;
        DateTime date = DateTime.ParseExact(metadata.DateTaken, "dd/MM/yyyy HH:mm:ss", null);
    D'ailleurs je sais pas trop pourquoi DateTaken est une string et pas un DateTime, surtout que c'est toujours formatté selon la culture courante, donc elle a déjà été parsée a priori

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour les exemples très détaillés, c'est parfait !

    Je ne connaissais même pas l'existence des métadonnées EXIF, j'aurai appris quelques chose.

    Encore merci.

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2005
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    Bonjour à tous,

    Je suis conscient de faire un super déterrage de sujet là mais, ayant été confronté à cette problématique et ayant bien galéré avant de trouver une solution, je partage le fruit de mes recherches, afin que, peut-être, cela serve à d'autres

    J'avais besoin de lire la date de prise de vue d'une photo. Et les données EXIF en utilisant la méthode citée précédemment ne fonctionnait pas pour toutes les photos, et ce alors que l'explorateur Windows ou Xnview me donnaient cette information. Je ne sais pas pourquoi.

    Le fait est que j'ai utilisé cette méthode et ça a fonctionné :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /// <summary>
    /// Fonction permettant de récupérer la date de création d'une image.
    /// </summary>
    /// <param name="fichier">Fileinfo: Fichier image dans lequel on va chercher la date de création</param>
    /// <returns></returns>
    private String recupDatePriseDeVueImage(FileInfo fichier)
    {
        // Variable de type Expression Régulière
        var regExp = new Regex(":");
     
        // On se connecte à l'image sans avoir à l'ouvrir
        using (var fStream = new FileStream(fichier.FullName, FileMode.Open, FileAccess.Read))
        using (Image monImage = Image.FromStream(fStream, false, false))
    	{
    	    	// On récupère l'information recherchée.
        		// Si elle n'est pas trouvée, on renvoie une chaine vide.
        		try {
            	PropertyItem propItem = monImage.GetPropertyItem(36867);
            	String datePDV = regExp.Replace(Encoding.UTF8.GetString(propItem.Value), ":", 2);
            	return datePDV;
        		} catch {
        			return "";
        		}
    	}
     
    }

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut OutOf Memory
    Bonjour,
    Excusez moi de reprendre ce vieux poste mais je m'en suis aidé pour faire mon petit programme mais j'ai une erreur OutOfMemoryExeption passé plus de 48 fichier.

    J'explique...

    Ma copine à un IPhone et ca m'énerve que le nom des images soit nommé "IMG_4522.jpg..." etc
    Moi j'aime bien avec mon Samsung que l'image soit nommé avec la date et l'heure du clicher.
    C'est beaucoup plus facile pour organiser et trier...
    Bref comme cette info est dispo dans les propriétés de l'image (ExifTag) mais que j'en ai des millier à renommer et que j'allais pas faire ça à la main je me suis fait un programme (en C#) pour automatiser tout ça.
    J'utilise un Visual Studio 2010, je suis loin d'être un expert et je ne comprend pas pourquoi j'ai une erreur sur la mémoire sur "Image img = Image.FromFile(pathFolder + fichier);" passé 48 fichiers?
    Est-ce que je dois fermer chaque fichier après traitement (et comment faire, je pensais qu'il se fermaient d'eux même) ?
    Merci de votre aide.

    Mon code
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.IO;
    using System.Drawing.Imaging;
     
    namespace PhotoDateRenamer
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void btn_Open_Folder_Click(object sender, EventArgs e)
            {
                // Chemin du dossier à traiter
                string pathFolder = @"D:\Tmp\";
                // Chemin du dossier ou stocker les nouveaux fichier
                string pathFolderRename = @"D:\Tmp\rename\";
                // On créé le dossier des nouveau fichiers si il n'existe pas
                Directory.CreateDirectory(pathFolderRename);
     
                // Créé la liste des fichiers
                DirectoryInfo dir = new DirectoryInfo(pathFolder);
                FileInfo[] fichiers = dir.GetFiles();
     
                // Pour chaque fichier de la liste
                foreach (FileInfo fichier in fichiers)
                {
                    // On créé l'image (vue qu'on renome des images)
                    Image img = Image.FromFile(pathFolder + fichier);
                    // On récupère sa propriété date de prise de vue
                    PropertyItem propItem = img.GetPropertyItem(0x0132);
                    string dateString = Encoding.ASCII.GetString(propItem.Value).TrimEnd('\0');
     
                    // Si l'image à bien une date de prise de vue
                    if (dateString != "" || dateString != null)
                    {
                        // On créé le nouveau nom
                        string newFileName = dateString.Replace(":", "").Replace(" ", "_");
     
                        int i = 0;
     
                        // On vérifie que l'image avec ce nouveau non n'existe pas déjà
                        while (File.Exists(pathFolderRename + newFileName + fichier.Extension) == true)
                        {
                            i++;
                            // Si oui on recréé un nouveau nom
                            newFileName = newFileName + "-0" + i;
                        }
     
                        // On copy l'image original avec le nouveau nom dans le dossié prévue
                        File.Copy(pathFolder + fichier, pathFolderRename + newFileName + fichier.Extension);
                    }
                    else
                    {
                        // Si l'image n'a pa de date de prise de vue on recopie l'image d'origine
                        File.Copy(pathFolder + fichier, pathFolderRename + fichier);
                        // On prévien pour info
                        MessageBox.Show("PAS DE DATE POUR :" + fichier);
                    }
     
                }
     
                //Fin du traitement
                MessageBox.Show("Fini!!");
            }
        }
    }

  7. #7
    Modérateur
    Avatar de DotNetMatt
    Homme Profil pro
    CTO
    Inscrit en
    Février 2010
    Messages
    3 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : CTO
    Secteur : Finance

    Informations forums :
    Inscription : Février 2010
    Messages : 3 611
    Points : 9 742
    Points
    9 742
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par AIDExpress Voir le message
    Est-ce que je dois fermer chaque fichier après traitement (et comment faire, je pensais qu'il se fermaient d'eux même) ?
    Oui il faut les fermer. L'objet Image implemente IDisposable donc tu peux utiliser un block using :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    using (var img = Image.FromFile(pathFolder + fichier))
    {
        // Le reste de ton code ici…
    }
    A la fin du block, ton objet sera automatiquement dispose.

  8. #8
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut Merci
    Merci DotNetMatt.
    Tout fonctionne nickel =D
    Excellente journée

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mai 2010
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 75
    Points : 60
    Points
    60
    Par défaut A non parlé trop vite...
    Si en fait c'est bon. J'avais des vidéos dans le dossier.
    Alors forcément, pris pour une images... ca sature ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Dates des prises de vue
    Par mga_geo dans le forum IGN API Géoportail
    Réponses: 4
    Dernier message: 03/08/2012, 17h22
  2. [XL-2007] Date de prise de vue
    Par BBe8127 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 04/07/2009, 18h27
  3. Date de prise en compte d'une démission
    Par moa3788 dans le forum Démission
    Réponses: 6
    Dernier message: 26/03/2008, 15h15
  4. Changer la date de prise de vue d'une image
    Par tomlev dans le forum Framework .NET
    Réponses: 1
    Dernier message: 24/09/2007, 15h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo