Avatar billede mr.handstand Novice
08. marts 2009 - 13:59 Der er 2 kommentarer og
1 løsning

liste 10000 jpg filers metadata i excel - hvornår er billedet faktisk taget

Hej,

Jeg vil gerne traversere 10.000 billeder i en mappestruktur og skrive én linje pr. billede i excel.

Min udfordring er at jeg ikke kan finde den rigtige dato - nedenstående finder ikke billedets optagelsesdato - kan jeg spørge på denne fil-egenskab, istedet for datecreated og datelastmodified.

Konkret får jeg billedet identificeret ift. hvornår det er lagt over på computeren, - jeg ønsker timestamp fra cameraet som tidspunkt.


Det er disse to linjer jeg gerne vil have udskiftet med noget der finder de rigtige JPG-metadata:

Range("destination").Offset(i, 2) = .DateCreated
                    Range("destination").Offset(i, 3) = .datelastmodified


------------------------------



Sub FindAndWriteJPGFilesInExcel()
    Const cFile = "*.jp*"
   

    Dim i As Long, rng As Range, wkb As Workbook
    Dim strFile As String, lngStartLine As Long, lngStartCol As Long
    Dim xCalc As XlCalculation, blnEvents As Boolean
    Dim cFolder As String ' cell containing path to be searched
    Dim myFSO, myFileObject

    cFolder = Range("Source")
    Set myFSO = CreateObject("Scripting.FileSystemObject")

    With Application.FileSearch
        .NewSearch
        .LookIn = cFolder
        .Filename = cFile
        .SearchSubFolders = Range("searchsubfolders").Value ' At test run i did not want to include the whole tree
        .MatchTextExactly = True
        .FileType = msoFileTypeAllFiles

        If .Execute() > 0 Then


            'On Error GoTo errwkb
            For i = 1 To .FoundFiles.Count
                Application.ScreenUpdating = False
                Set myFileObject = myFSO.GetFile(.FoundFiles(i))
                With myFileObject
                    Range("destination").Offset(i, 1) = .Name
                    Range("destination").Offset(i, 2) = .DateCreated
                    Range("destination").Offset(i, 3) = .datelastmodified
                    Range("destination").Offset(i, 4) = .Path
                    Range("destination").Offset(i, 5) = .Size
                   
                   
                End With
                Set myFileObject = Nothing
                If (i Mod 1000 = 0) Then
                    MsgBox i ' this line I put a break mark on, since the code slowed my PC down, then for every 1000 pics i regained CPU control
                End If
                Debug.Print i
            Next i
                Application.ScreenUpdating = True
        End If
        End With
       

End Sub
Avatar billede falster Ekspert
08. marts 2009 - 23:24 #1
Jeg er ikke bekendt med, at/hvordan vba håndterer exif-data.

Men jeg kan foreslå 2 work arounds:

1:
Kommandolinjeværktøjet jhead kan køres på mapper med jpg's og parameteren -ft.

Denne parameter udfører

"Sets the file's system time stamp to what is stored in the Exif header."

Og filsystems-datoerne kan du jo håndtere med vba.

http://www.sentex.net/~mwandel/jhead/usage.html

2:

Brug EXIF Image Renamer til at omdøbe filerne til optagetidspunktet - ned til sekunder. Eks. 20090309-012034.jpg.

http://www.photo-freeware.net/exif-image-renamer.php
Avatar billede mr.handstand Novice
10. marts 2009 - 21:13 #2
@falster

Din workaround virkede.

Jeg har ændret "modified date" og efterfølgende virkede min egen vba kode fint. Pudsigt nok blev en del billeder opdateret med en difference på 1 time fra det faktiske, korrekte tidspunkt - på trods af at Picassa og andre viste dette korrekte timestamp som oplysning om optagelsesdato. Sommertid kan ikke være årsagen.

Nå, skidt med det - tidspunktet er mindre afgørende. Datoen er rigtig pånær billederne lige omkring midnat, hvilket er tæt nok på.

Læg et svar sherlock, så får du tildelt point.

Tak for hjælpen.
Avatar billede falster Ekspert
10. marts 2009 - 23:53 #3
Udmærket, du fik det løst.

Muligvis er det noget med tidszonen.

Jhead kan faktisk også batche det. Men "så avanceret" har jeg aldrig brugt værktøjet. Citat fra manualen:

-ta<timediff>

Adjust time stored in the Exif header by h:mm backwards or forwards. Useful when having taken pictures with the wrong time set on the camera, such as after travelling across time zones, or when daylight savings time has changed. This option uses the time from the "DateTimeOriginal" (tag 0x9003) field, but sets all the time fields in the Exif header to the new value. Version 2.0 and earlier only modified the "DateTimeOriginal" (tag 0x9003) field, but too many people thought that that was a bug. Examples:
Adjust time one hour forward (you would use this after you forgot to set daylight savings time on the digicam)

jhead -ta+1:00 *.jpg

Adjust time back by 23 seconds (you would use this to get the timestamps from two digicams in sync after you found that they didn't quite align)

jhead -ta-0:00:23 *.jpg

Adjust time forward by 2 days and 1 hour (49 hours)

jhead -ta+49 *.jpg
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester