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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    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

  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 : 50
    Localisation : Belgique

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    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

  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
    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 confirmé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 123
    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()

+ 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