Clever-Excel-Forum

Normale Version: Foto bewerten
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Forum,

mit dem folgenden Code lässt sich die Bewertung eines Fotos auslesen.

Sub getRanking()
    Dim OFS As Object, oFile As Object
    Dim objShell As Object, objFolder As Object
    Dim strPath, strFile As String
   
    strFile = "C:\Test\Foto.JPG"
    'FileSystemObjekte
    Set OFS = CreateObject("Scripting.FileSystemObject")
    Set oFile = OFS.GetFile(strFile)
    strPath = oFile.ParentFolder
   
    'ShellObjekte
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(strPath)
    'Bewertung
    Debug.Print objFolder.GetDetailsOf(objFolder.Items.Item(oFile.Name), 19)
End Sub

Wie kann man diese Dateieigenschaft via VBA-Code ändern?

mfG
Rolf Beißner
Hallo,

die Bewertung kann zwar per Hand im Explorer geändert werden, aber m.W.n. nicht mit VBA. Auch in meinen Unterlagen zu WIA habe ich nicht gefunden.

Es gibt auch API-Zugriffe auf die Properties, aber auch da fand ich keine Beispiele für diesen Zweck.

Gefunden habe ich ein VB-Project "ExIf-Writer", das verspricht solche Änderungen vornehmen zu können (ähnlich wie C++ uä)

Vermutlich ist es das Einfachste ein Foto-Software wie "Exiftools" zu nutzen (oder Lightroom).

Ich hoffe, es kommen noch andere Beiträge.

mfg
Hallo Forum,

die angestrebte Lösung - "Foto bewerten via VBA" - habe ich nicht gefunden.
Stattdessen einen "work-around", der für meine Zwecke - "bestimmte Fotos kennzeichnen zwecks Filtermöglichkeit" - ausreicht.
Für etwaige Interessenten hier der entsprechende Code.

fG
Rolf Beißner


Code:
Option Explicit
' Bildkopie mit Kommentar in sep. Verzeichnis anlegen
' Verweis setzen auf: "Microsoft Windows Image Acquisition Library v2.0"
Sub setProp()
    'Deklarationen
    Dim objImage As ImageFile
    Dim objIP  As ImageProcess
    Dim objVector As Vector
    Dim strID As Variant
    Dim strFile As String
    Dim iRow As Integer, iCount As Integer
   
    'Property-IDs
    strID = Array("40091", "40092", "40093", "40094", "40095") 'Titel,Kommentar,Autor,Stichwort,Betreff
    
    'WIA-Objekte
    Set objImage = CreateObject("WIA.ImageFile")
    Set objIP = CreateObject("WIA.ImageProcess")
    Set objVector = CreateObject("WIA.Vector")
    
    'Anzahl der Einträge im aktiven Sheet (ab Zeile 2)
    iCount = 5
   
    'Einträge abarbeiten
    For iRow = 1 To iCount
       
        'vollständiger Dateiname  - z.B. "C:\Test\Foto.jpg"
        strFile = Cells(iRow + 1, 1)
       
        'Bild laden
        objImage.LoadFile strFile
        
        'Filter Parameter
        objIP.Filters.Add objIP.FilterInfos("Exif").FilterID
        objIP.Filters(1).Properties("ID") = strID(1) 'hier Kommentar
        objIP.Filters(1).Properties("Type") = VectorOfBytesImagePropertyType
       
        'Kommentartext
        objVector.SetFromString "Auswahl"
        objIP.Filters(1).Properties("Value") = objVector
       
        'Kommentar einstellen
        Set objImage = objIP.Apply(objImage)
            
        'Bild unter gleichem Namen in sep Verzeichnis speichern (hier "..Test\Auswahl\..")
        objImage.SaveFile Replace(strFile, "Test\", "Test\Auswahl\")
    Next
End Sub
Hallo,

danke für den Hinweis.

Das "CreationDate" ist nicht so einfach zuändern, aber so geht es:

Code:
$Tag = get-date

Set-ItemProperty -Path C:\Users\User\Desktop\Kreis.jpg -Name 'CreationTime' -Value $Tag.AddDays(-12)

Get-ItemProperty -Path C:\Users\User\Desktop\Kreis.jpg -Name 'CreationTime'

(Powershell)

mfg
Hallo Fennek,

danke für den Tipp. Sehr hübsch Blush
Gibt es auch die Möglichkeit, das im Windowsexplorer angezeigte Aufnahmedatum zu modifzieren?

fG
Rolf
na ja, wenn Du fragst:

https://chrisjwarwick.wordpress.com/2011...-cmdlet-2/

Im Netz gibt es auch Ansätze für C++.
Hallo Rolf, :19:

so setzt du die drei Zeiten "Erstellt", "Geändert" und "Letzter Zugriff" mit PowerShell:

Code:
$DateTime = get-date 10.10.2019-14:00
[System.IO.File]::SetLastWriteTime("C:\Temp\rh.jpg", $DateTime)
[System.IO.File]::SetLastAccessTime("C:\Temp\rh.jpg", $DateTime)
[System.IO.File]::SetCreationTime("C:\Temp\rh.jpg", $DateTime)

Noch gibt es die Unterschiede UTC+2 / UTC+1 - je nach Sommer- bzw. Winterzeit.

Alle JPG-Dateien eines Ordners - "Geändert" = "Erstellt" in PowerShell:

Code:
gci C:\Temp\*.jpg | ? {!$_.PSisContainer} | % {$_.LastWriteTime=$_.CreationTime}

Für Das Aufnahmedatum nutze ich "jhead". In der Dokumentation ist für dich der Parameter "-dsft" interessant.

Um das Aufnahmedatum eines Bildes zu ändern:

Code:
C:\Temp\jhead.exe -dsft C:\Temp\rh.jpg

Da es ein "Kommandozeilentool" ist, lässt es sich auch per VBA steuern. :21:
Diese Quelle ist besser:

https: //social.technet.microsoft.com/Forums/scriptcenter/en-US/8b398413-0728-4a8a-a593-d2e8b92b88f2/editing-image-exif-tags?forum=ITCG

Damit reduziert sich das PS-Script (an einem Beispiel getestet):

Code:
$f = 'C:\Users\Office\Desktop\Date_Test2.jpg'

$img = [System.Drawing.Image]::FromFile($f)

$item = $img.psbase.GetPropertyItem(36867)

$New_time = get-date 01.12.2015 #$Old_time.Add('100')

$NT_Str = $New_time.ToString("yyyy:MM:dd HH:mm:ss`0")

$item.Value = [byte[]][System.Text.Encoding]::ASCII.GetBytes($NT_Str)

$img.SetPropertyItem($item)

$img.Save('C:\users\Office\Desktop\neu.jpg')
Guten Morgen Fennek,

vielen Dank für deine Mühe Blush 
Klappt vorzüglich. Erstaunlich, was alles geht.

Herzliche Grüße
Rolf