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 :

Utilisation de metadata-extractor-dotnet [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut Utilisation de metadata-extractor-dotnet
    Bonjour à tous

    Je cherche le moyen de récupérer les données EXIF de fichiers provenant de différentes sources.

    J'ai cherché de la doc sur le net et tester plusieurs choses.
    La fonction du Framework GetPropertyItem ne plait pas trop.
    J'ai aussi essayé Visual Basic JPEG EXIF Reader et ExifLib - A Fast Exif Data Extractor for .NET 2.0+
    Mais ça ne me convient pas non plus.

    Et je suis tombé sur la librairie MetadataExtractor
    Cela a l'air complet et parfait mais je ne trouve pas des exemples d'utilisation en VB.Net et je bloque car je n'arrive pas à convertir les exemples de code que j'ai trouvé.
    J'ai référencé les DLL MetadataExtractor.dll, XmpCore.dll et ICSharpCode.SharpZipLib.dll utilsées par MetadataExtractor et j'ai essayé de traduire l'exemple trouvé sur Github
    IEnumerable<Directory> directories = ImageMetadataReader.ReadMetadata(imagePath);
    en
    Dim Directories As MetadataExtractor.Directory = MetadataExtractor.ImageMetadataReader.ReadMetadata("C:\Users\Public\Pictures\Sample Pictures\Koala.jpg")
    et j'ai un message d'erreur
    Une exception non gérée du type 'System.InvalidCastException' s'est produite
    Informations supplémentaires*: Impossible d'effectuer un cast d'un objet de type 'System.Collections.Generic.List`1[MetadataExtractor.Directory]' en type 'MetadataExtractor.Directory'.
    Mais je ne comprends pas le message.
    Ayant un accès très restreint au net, je n'ai pas pu accéder aux différents sites de conversion.



    Merci de votre aide

  2. #2
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    J'ai réussi à faire quelque chose qui a l'air de fonctionner, à l'aide de MSDN

    Quel est votre avis sur ce code :
    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
    Imports MetadataExtractor
     
    Public Class Form3
        Implements IEnumerable(Of Directory)
     
        Private _filePath As String
     
        Public Sub New(ByVal strFichier As String)
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            _filePath = strFichier
     
            Dim Directories As IEnumerable(Of MetadataExtractor.Directory) = MetadataExtractor.ImageMetadataReader.ReadMetadata(strFichier)
     
            ListView5.View = View.Details
            ListView5.Columns.Add("Information", 100, HorizontalAlignment.Left)
            ListView5.Columns.Add("Valeur", 150, HorizontalAlignment.Left)
            Dim MyLine As ListViewItem
     
            For Each Directory In Directories
                For Each MonInfo As MetadataExtractor.Tag In Directory.Tags
                    MyLine = New ListViewItem(New String() {MonInfo.Name, MonInfo.Description})
                    ListView5.Items.Add(MyLine)
                Next
            Next
        End Sub
     
        Public Function GetEnumerator() As IEnumerator(Of Directory) Implements IEnumerable(Of Directory).GetEnumerator
            Return New Form3(_filePath)
        End Function
     
        Private Function GetEnumerator1() As IEnumerator Implements IEnumerable.GetEnumerator
            Return Me.GetEnumerator()
        End Function
     
    End Class

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Bonjour,

    Pourquoi dans ton exemple Form3 implémente-t-elle l'interface IEnumerable(Of Directory) ?

  4. #4
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Je ne sais pas trop ebastien.
    Ayant cherché des infos sur le net pour le message d'erreur que j'avais lors de mes premiers tests (décrit sur mon 1er post), j'avais fini par trouvé ce qui me paraissait être la solution. Je ne connaissais pas du tout et je dois dire que j'ai pas tout compris de ce que j'ai implémenté.
    Et c'est pour ça que j'ai demandé l'avis du forum.

    J'ai enlevé tout ce qui concerne IEnumerable et effectivement ca fonctionne. Voici le nouveau code :
    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
    Imports MetadataExtractor
     
    Public Class Form3
        Public Sub New(ByVal strFichier As String)
     
            ' Cet appel est requis par le concepteur.
            InitializeComponent()
     
            Dim Directories As IEnumerable(Of MetadataExtractor.Directory) = MetadataExtractor.ImageMetadataReader.ReadMetadata(strFichier)
     
            ListView5.View = View.Details
            ListView5.Columns.Add("Information", 100, HorizontalAlignment.Left)
            ListView5.Columns.Add("Valeur", 150, HorizontalAlignment.Left)
            Dim MyLine As ListViewItem
     
            For Each Directory In Directories
                For Each MonInfo As MetadataExtractor.Tag In Directory.Tags
                    MyLine = New ListViewItem(New String() {MonInfo.Name, MonInfo.Description})
                    ListView5.Items.Add(MyLine)
                Next
            Next
        End Sub
     End Class
    C'est plus clean comme cela ?

  5. #5
    Membre Expert
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Par défaut
    Je me doutais un peu de la réponse.
    Pour faire simple, une classe implémente l'interface IEnumerable lorsque qu'elle contient une liste d'objet et que l'on veut pouvoir faire un "foreach" sur cette classe afin d'énumérer tous les objets de la liste qu'elle contient (un petit tuto en anglais).
    Ton implémentation me paraît mieux. Toutefois, je n'aurais pas mis la construction du Listview dans le constructeur de la Form mais dans une méthode à part afin de pouvoir faire un raffrachissement ou bien la rappeler avec un autre nom de fichier par exemple. Ici, après avoir construit ta Form, tu es bloqué, tu ne peux plus la mettre à jour...

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Merci pour les explications et le lien

    Ce code n'est pas la version définitivement implémentée. c'est juste un projet de test. Quand je ne connais pas quelque chose et/ou je veux tester un truc spécifique, je crée un nouveau projet qui me laisse totalement libre de faire tout ce que je veux la découverte.
    Ensuite, je rationalise le truc et l'implémente au bon endroit.

    Ici, je pense que je vais faire une classe spécifique pour l'EXIF.

    Merci
    Bonne journée à tous

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

Discussions similaires

  1. Utiliser des fonctions du dotnet dans VBScript
    Par bruce-willis dans le forum VBScript
    Réponses: 4
    Dernier message: 18/07/2011, 12h28
  2. [WD16] utiliser itext partie extractor
    Par gancau dans le forum WinDev
    Réponses: 4
    Dernier message: 12/04/2011, 14h43
  3. Réponses: 5
    Dernier message: 11/03/2011, 11h59
  4. Utiliser un metadata selon un champ sur un fichier positionnel
    Par princebenin dans le forum Développement de jobs
    Réponses: 2
    Dernier message: 19/11/2009, 16h28
  5. Utilisation d'un programme DotNet
    Par Seth77 dans le forum Framework .NET
    Réponses: 12
    Dernier message: 10/08/2007, 23h50

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