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 :

VB2008 Express Informations EXIF


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut VB2008 Express Informations EXIF
    Bonjour à tous,

    nouveau dans le monde du VB, j'ai décidé de télécharger VB2008 Express pour commencer à me faire la main et réaliser quelques programmes. Jusqu'à maintenant, je développais en Windev et VBA Access dans le cadre de mon métier.

    L'une des applications personnelles que je souhaite réaliser (comme beaucoup d'ailleur) et un programme de renommage d'images. Pour se faire, j'avais réaliser un programme Access qui utilise le module de classe clGdiPlus. J'étais en mesure d'extraire la date de prise de vue des images d'un répertoire. Ensuite, je faisait un simple tri sur cette date, et hop, une petite boucle me renommait toute mes photos selon un format prédéfini et les indiçait de 001 à XXX. Comme ça, l'affichage de l'ordre sous l'explorateur était correct (ainsi que sous n'importe quelle autre plateforme).

    Par contre, ce programme fonctionnant sous Access 2007, la nécessité de son installation est un frein. C'est pourquoi j'ai voulu réaliser ce même programme sous VB2008 Express (car gratuit) pour n'avoir qu'un .exe léger pour réaliser cette même action.

    Le problème est que je ne sais absolument pas comment, après avoir lister les images d'un répertoire spécifié, récupérer les informations EXIF afin de récupérer la date de prise de vue, seule information qui m'importe.

    Après quelques vaines recherches, je me tourne donc vers le communauté developpez.com pour savoir si quelqu'un dispose d'un bout de code VB2008 (avec les méthodes de déclaration) afin de récupérer cette information.

    Merci de votre intérêt et de votre aide.

  2. #2
    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
    Par défaut
    Tu peux accéder aux tags EXIF via la méthode Image.GetPropertyItem
    Mais c'est pas très pratique, il faut connaitre le code et le format du tag qui t'intéresse, et décoder les données binaires du tag...
    Pour la date de prise de vue, c'est sans doute un de ces codes :
    * 0x0132 ModifyDate
    * 0x9003 DateTimeOriginal
    * 0x9004 CreateDate
    (d'après cette page)

    Par exemple pour extraire le champ DateTimeOriginal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim img As Image = Image.FromFile("leFichier.jpg")
    Dim prop As PropertyItem = img.GetPropertyItem(&H9003)
    Dim sDate As String = Encoding.ASCII.GetString(prop.Value, 0, prop.Len).TrimEnd(Chr(0))
    Dim dateTimeOriginal As DateTime = DateTime.ParseExact(sDate, "yyyy:MM:dd HH:mm:ss", Nothing)

  3. #3
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    Mille merci pour cette réponse rapide.
    Je vais de ce pas tester l'intégration de ce code à ma source.
    Je ne serait à nouveau disponible que demain matin pour vous informer de l'état d'avancement.

    Bonne journée à vous.

  4. #4
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    Bonjour,
    malheureusement, je n'arrive pas a intégrer l'exemple de code que vous m'avez fourni car le type PropertyItem ne semble pas défini dans mon environnement, de même pour la méthode Encoding

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim prop As PropertyItem = img.GetPropertyItem(&H9003)
    Dim sDate As String = Encoding.ASCII.GetString(prop.Value, 0, prop.Len).TrimEnd(Chr(0))
    Afin de vous aider à comprendre le fonctionnement de mon programme, voici le code source importé d'Access 2007 sous VB 2008 Express. Celui ci ne fonctionne pas car la classe utilisée n'est pas adaptable et certaines fonctions ne semble pas utilisables dans cet environnement.
    Chaque ligne faisant l'objet d'une erreur est suivi du libellé de l'erreur en commentaire.

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    '----------------------------------------------------------------- 
    '	Code fonctionnel tel que conçu sous VBA Access 2007
    '	et importé sous VB2008 Express avec erreurs
    '----------------------------------------------------------------- 
     
    Public Class PicturesRenamer
     
        Private Sub ButtonSource_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonSource.Click
     
            If FolderBrowserDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
                TextBoxSource.Text = FolderBrowserDialog.SelectedPath & "\"
            End If
     
        End Sub
     
        Private Sub ButtonDestination_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDestination.Click
     
            If FolderBrowserDialog.ShowDialog() = Windows.Forms.DialogResult.OK Then
                TextBoxDestination.Text = FolderBrowserDialog.SelectedPath & "\"
            End If
     
        End Sub
     
        Private Sub RenamePictures(ByVal SourceFolder As String, ByVal DestinationFolder As String, ByVal PictureName As String)
     
            Dim clGdip As New clGdiPlus 'Classe de récupération de données EXIF venant de VBA ne fonctionnant pas ici
            Dim FileName As String
            Dim FileDate As String
            Dim NumFiles As Integer
            Dim Files() As String
            Dim Position As Integer
            Dim OldPictureName As String
            Dim NewPictureName As String
            Dim i As Integer
     
            If Len(PictureName) = 0 Then
                MsgBox("Please enter a standard Windows name for your pictures.", vbOKOnly + vbInformation, "PictureRename")
                Exit Sub
            End If
     
            If Len(SourceFolder) = 0 Then
                MsgBox("Please select a directory which contains your pictures.", vbOKOnly + vbInformation, "PictureRename")
                Exit Sub
            End If
     
            If Len(DestinationFolder) = 0 Then
                MsgBox("Please select a destination directory for your renamed pictures.", vbOKOnly + vbInformation, "PictureRename")
                Exit Sub
            End If
     
            If SourceFolder = DestinationFolder Then
                MsgBox("Please select differents directories.", vbOKOnly + vbInformation, "PictureRename")
                Exit Sub
            End If
     
            clGdip = New clGdiPlus 'Type 'clGdiPlus' non défini. --> Normal
            FileName = Dir(SourceFolder)
            Do While Len(FileName) > 0
                If FileName <> "." And FileName <> ".." Then
                    NumFiles = NumFiles + 1
                    ReDim Preserve Files(1 To NumFiles) 'Les limites inférieures du tableau ne peuvent être que '0'.
                    clGdip.OpenFile(SourceFolder & FileName)
                    FileDate = Format(clGdip.GetExifData(TagDateTimeOriginal), "yyyymmddhhnnss") 'Le nom 'TagDateTimeOriginal' n'est pas déclaré. --> Normal
                    Files(NumFiles) = FileDate & "%" & FileName
                End If
                FileName = Dir()
            Loop
     
            clGdip.CloseFile()
     
            QuickSort(Files, 1, NumFiles)
     
            For i = 1 To NumFiles
                Position = InStr(1, Files(i), "%", vbTextCompare)
                FileName = Right(Files(i), (Len(Files(i)) - Position)) 'Public ReadOnly Property Right() As Integer' n'a aucun paramètre et son type de retour ne peut pas être indexé.
                OldPictureName = SourceFolder & FileName
                NewPictureName = DestinationFolder & PictureName & " (" & Format(i, "###000") & ").jpg"
                Name OldPictureName As NewPictureName 'Un accès à la propriété doit assigner la propriété ou utiliser sa valeur.
     
            Next i
     
            MsgBox("Operation finished.")
     
        End Sub
     
        Private Sub QuickSort(ByVal List() As String, ByVal Min As Long, ByVal Max As Long)
     
            Dim Median As String
            Dim Hight As Long
            Dim Low As Long
            Dim i As Long
     
            If Min >= Max Then Exit Sub
     
            i = Int((Max - Min + 1) * Rnd() + Min)
            Median = List(i)
            List(i) = List(Min)
            Low = Min
            Hight = Max
     
            Do
                Do While List(Hight) >= Median
                    Hight = Hight - 1
                    If Hight <= Low Then Exit Do
                Loop
                If Hight <= Low Then
                    List(Low) = Median
                    Exit Do
                End If
     
                List(Low) = List(Hight)
                Low = Low + 1
     
                Do While List(Low) < Median
                    Low = Low + 1
                    If Low >= Hight Then Exit Do
                Loop
                If Low >= Hight Then
                    Low = Hight
                    List(Hight) = Median
                    Exit Do
                End If
     
                List(Hight) = List(Low)
     
            Loop
     
            QuickSort(List, Min, Low - 1)
            QuickSort(List, Low + 1, Max)
     
        End Sub
     
        Private Sub ButtonRename_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonRename.Click
     
            Call RenamePictures(TextBoxSource.Text, TextBoxDestination.Text, TextBoxName.Text)
     
        End Sub
     
    End Class
    Merci de votre patience et de vos conseils avisés afin de m'aider à avancer. Si aucune issue ne semble possible en l'état, je me tournerai vers un autre langage tel que C# pour voir ce que ça donne.

    Et pour couronner le tout, impossible d'utiliser la molette de ma souris sous peine de voir l'environnement planter.

    Edit: Je veux bien que des fonctions puissent changer de synthaxe mais là, je suis complètement perdu.

  5. #5
    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
    Par défaut
    il faut importer les namespaces System.Text, System.Drawing, et System.Drawing.Imaging

  6. #6
    Membre averti
    Inscrit en
    Octobre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 14
    Par défaut
    Merci encore.

    J'ai également réussi à retrouver les équivalences des fonctions que je n'arrivait pas à faire fonctionner. Je vais donc tout faire pour l'importation des namespaces afin de récupérer l'information EXIF présente à l'offset spécifié.

    En attendant, bonne journée.

    Edit: Merci l'importation automatique des namespaces et désolé d'avoir posée un question aussi bête. J'arrive donc à récupérer l'information ShootingDateTime. Je vais faire quelques test pour voir si tout fonctionne bien et mettrait le source à disposition dès que possible car au vue de mes recherches, je ne suis pas seul à chercher une solution à ce problème.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/08/2008, 18h44
  2. [VB2008 Express] Automation avec Access 2003
    Par sigap dans le forum VB.NET
    Réponses: 3
    Dernier message: 14/07/2008, 20h05
  3. Pb sql express et vb2008 express
    Par libremax dans le forum VB.NET
    Réponses: 7
    Dernier message: 28/03/2008, 15h31
  4. Problème de compilation sur VB2008 Express
    Par djorfe dans le forum VB.NET
    Réponses: 5
    Dernier message: 12/03/2008, 10h25
  5. Ecriture d'information Exif
    Par airod dans le forum Général Python
    Réponses: 2
    Dernier message: 14/02/2007, 09h31

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