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

VB.NET Discussion :

Lecture EXIF : c'est long.


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut Lecture EXIF : c'est long.
    Bonjour,

    avec l'aide de divers forums mais aussi des précieuses informations glanées auprès de vous, je parviens à récupérer les données EXIF de fichiers .JPG, et notamment la date/heure de prise de vue.
    Oui, mais cela me semble long. 16 secondes pour 50 images... c'est pas top comme performance. J'aperçois d'ailleurs la barre de défilement vertical de ma listview qui apparaît progressivement. Je precise que quand il s'agit de 50 fichiers non .JPG, la durée est quasi instantanée.

    Pourriez vous me dire si qque chose cloche dans mon code ? Merci. Jeremy

    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
    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
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            ListV1_initialize()
     
            Dim folderbrowser As New FolderBrowserDialog
     
            If folderbrowser.ShowDialog = Windows.Forms.DialogResult.OK Then
     
     
                folder = New System.IO.DirectoryInfo(folderbrowser.SelectedPath)
                Dim folderFi As IO.FileInfo() = folder.GetFiles("*.*")
                Dim Fi As IO.FileInfo
     
                Dim FiNom As String
                Dim arr(5) As String
                Dim itm As ListViewItem
     
                Dim img As Image
                Dim prop As PropertyItem
                Dim sDate As String
                Dim dateTimeOriginal As DateTime
                Dim tps1 As DateTime
                Dim tps2 As DateTime
     
                For Each Fi In folderFi
     
                    FiNom = Fi.FullName
                    arr(0) = Fi.Name
                    arr(1) = Math.Round((Fi.Length) / 1024, 0)
                    arr(1) = Format(Int(arr(1)), "# ### ###") & " Ko"
                    arr(2) = Fi.Extension
                    arr(3) = (Fi.CreationTime)
     
                    'si le fichier est une image, je lis son EXIF, sinon je sors.
                    If Fi.Extension = ".JPG" Then
     
     
                        Dim fs As New System.IO.FileStream(FiNom, FileMode.Open)
                        img = Image.FromStream(fs)
                        fs.Close()
     
                        'utilisation de system.drawing.imaging 
                        img = Image.FromFile(FiNom) 'recupere le chemin complet de l'image pour la date_prise_de_vue 
                        prop = img.GetPropertyItem(&H9003)
                        sDate = Encoding.ASCII.GetString(prop.Value, 0, prop.Len).TrimEnd(Chr(0))
                        dateTimeOriginal = DateTime.ParseExact(sDate, "yyyy:MM:dd HH:mm:ss", Nothing)
                        arr(4) = dateTimeOriginal
                        img.Dispose()
     
     
                    Else
     
                        arr(4) = "not a pic" 'quand ce n'est pas un fichier JPG, je ne cherche pas l'EXIF.
     
                    End If
     
                    itm = New ListViewItem(arr)
                    ListV1.Items.Add(itm)
                    ' msg pour visualiser où ca plante     MsgBox(arr(0))
     
     
                Next
     
            End If
     
        End Sub
    Jérémy

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Interessant....ce serait parce que le JPG est plus long à décoder?
    Tu as essayé avec un profileur ou il passe tout ce temps supplémentaire? Dans le Image.FromStream j suppose
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    non, je n'ai pas essayé avec un profileur, je ne sais pas ce que c'est
    toutefois, j'ai mesuré cela avec DateInterVal.second pour arriver à 16.
    je dois maintenant mesurer à la millisecondes pour avoir une idée plus précise.

    je vous tiens au courant
    Jérémy

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bopnjour,
    Citation Envoyé par jerem7w Voir le message
    toutefois, j'ai mesuré cela avec DateInterVal.second pour arriver à 16.
    je dois maintenant mesurer à la millisecondes pour avoir une idée plus précise.
    Pour mesurer le temps de ton traitement, tu peux utiliser la classe Stopwatch, un exemple est fourni.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    voilà, j'ai mesuré le temps de traitement de ma boucle dans la condition IF : environ 15s pour 50 images.
    Lorsque je prends la mesure à l'extérieur du IF, j'ai sensiblement la même chose.
    Donc en gros, pour récupérer l'information date prise de vue, le traitement dure 300ms par image.

    Par comparaison, pour un dossier de 36 fichiers videos, la durée de traitement est de 00 seconde 010 ms, soit 0,3ms ! C'est 1000 fois plus rapide !?

    Il va me falloir trouver comment accélerer cela.

    Jeremy
    Jérémy

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    Bonjour,

    j'ai effectué quelques mesures plus précises. Pour 50 images jpg, ma boucle if dure 15,265 secondes, dont 7,389 pour le flux et 7,542 pour l'image

    dans le Flux, c'est ça qui dure 7,4 secondes : img = Image.FromStream(fs)
    ensuite, pour récupérer les propriétés de l'image, c'est ça qui dure 7,5 s : img = Image.FromFile(FiNom)

    -> donc la classe Image de System.Imaging semble lourde en terme de performances.
    Cela vous semble-t-il logique ?

    voici la boucle if
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     If Fi.Extension = ".JPG" Then
     
     
                        Dim fs As New System.IO.FileStream(FiNom, FileMode.Open)
                        img = Image.FromStream(fs)
                        fs.Close()
     
                        'utilisation de system.drawing.imaging 
                        img = Image.FromFile(FiNom) 'recupere le chemin complet de l'image pour la date_prise_de_vue 
                        prop = img.GetPropertyItem(&H9003)
                        sDate = Encoding.ASCII.GetString(prop.Value, 0, prop.Len).TrimEnd(Chr(0))
                        dateTimeOriginal = DateTime.ParseExact(sDate, "yyyy:MM:dd HH:mm:ss", Nothing)
                        arr(4) = dateTimeOriginal
                        img.Dispose()
    Jérémy

  7. #7
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Juste une question bête :
    La date de prise de vue ne serait elle pas la même que la date de création du fichier image?

    Si ça se vérifie, il est peut être plus rapide de passer par un System.IO.FileInfo...
    est ton amis, MSDN est ton maître, pour le reste il y a Developpez.net. Pensez au au et

  8. #8
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Rainui Voir le message
    Bonjour,
    Juste une question bête :
    La date de prise de vue ne serait elle pas la même que la date de création du fichier image?

    Si ça se vérifie, il est peut être plus rapide de passer par un System.IO.FileInfo...
    Effectivement il serait judicieux de vérifier cela.

    Je rajoute que ceci ne détermine en rien que ton fichier est un fichier Jpg !!! :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          'si le fichier est une image, je lis son EXIF, sinon je sors.
                    If Fi.Extension = ".JPG" Then
    '...
    '......
    par exempe : si le fichier est un fichier .png dont l'extension a été renommée en .jpg tu risques de rencontrer une exception !

    Je t'ai donné la solution ici pour palier à cela :

    http://www.developpez.net/forums/d14...n/#post7853112

    A+

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    bonjour,

    La date de création des photos prises avec mon appareil est la date ou j'ai copié les photos sur mon PC, d'où la différence avec la date de prise de vue.

    wallace1 : merci pour ta remarque et solution, je comptais m'y attaquer très prochainement.
    Jérémy

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    Points : 83
    Points
    83
    Par défaut
    Bonsoir,

    je remonte ce topic pour vous dire que j'ai trouvé la solution à mon problème. Comme décrit plus tôt, je bouclais sur tout une serie d'image via un flux FromStream afin de récupérer certaines info EXIF de mes images jpeg (ou autres).

    Cela prenait un temps déraisonnable avec ce code-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim fs As New System.IO.FileStream(FiNom, FileMode.Open)
                        img = Image.FromStream(fs)
                        fs.Close()
    566 images (2,6Go) parcourues par le flux en 166 secondes, soit 3 images par secondes.

    En utilisant la même méthode sensiblement différemment, le traitement est 80 fois plus rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim fs As New System.IO.FileStream(FiNom, FileMode.Open)
                        img = Image.FromStream(fs,false,false)
                        fs.Close()
    La méthode ci-dessus épargne à mon application de la lecture d'info inutile -> 566 images en...2,3 secondes ! 250 images secondes !

    Pour ceux que cela intéresse : http://msdn.microsoft.com/fr-fr/libr...vs.110%29.aspx

    Merci à vous.
    Jérémy

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

Discussions similaires

  1. lecture de donnée type long raw
    Par vbcasimir dans le forum Interfaces de programmation
    Réponses: 1
    Dernier message: 28/08/2009, 19h11
  2. La fermeture de Vista. c'est long !
    Par Louis Griffont dans le forum Windows Vista
    Réponses: 33
    Dernier message: 04/12/2008, 00h42
  3. Réponses: 3
    Dernier message: 22/08/2007, 16h53
  4. Apprentissage du Pascal : Est-ce que c'est long ou dur ?
    Par anthonytheboss dans le forum Langage
    Réponses: 9
    Dernier message: 02/04/2006, 17h48

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