Wie kann ich Fotos schrittweise datieren?

8

Ich habe eine Sammlung von Fotos, die keine Datumsinformationen enthalten. Sie haben keine Exif-Daten und die Änderungsdaten der Datei sind alle identisch. Die einzige Sequenz befindet sich im Dateinamen: image-0001.jpg, image-0002.jpg usw.

Jetzt möchte ich diesen Dateien (vorzugsweise in Exif) ein Datum zuweisen, die alle 10 Sekunden voneinander entfernt sind. Ich bin nicht so interessiert daran, wie genau das Basisdatum und die Basiszeit aussehen werden, nur dass sie alle 10 Sekunden inkrementieren. Das erste Bild erhält also 0:00:00, das zweite 0:00:10, das dritte 0:00:20 usw.

Ist dies mit ExifTool oder anderen Windows-Anwendungen möglich? Wir sprechen über mehrere tausend Bilder, daher kommt es nicht in Frage, dies manuell zu tun ;-)

Peter
quelle

Antworten:

8

In den ExifTool-Foren gibt es bereits eine ähnliche Frage . Dies kann mit zwei aufeinander folgenden ExifTool-Befehlen erfolgen. Stellen Sie zunächst sicher, dass alle Daten gleich sind

exiftool -datetimeoriginal="2015:02:22 00:00:00" DIR

Und erhöhen Sie dann jeweils die Zeit

exiftool '-datetimeoriginal+<0:0:${filesequence}0' DIR
StarGeek
quelle
Hallo StarGeek. Wie unterscheidet sich diese Antwort von der von Junkyardsparkle?
Saaru Lindestøkke
@Bart ist hier $filesequenceeine magische Exiftool-Variable. in junkyardsparkle's $fileist eine Bash-Variable. Dies ist tragbarer; Der andere verknüpft die Zeit eher mit dem Dateinamen als mit der Reihenfolge, in der exiftool sie liest.
Bitte lesen Sie mein Profil
Ordentlich. Ich hatte das Gefühl, dass exiftool so etwas tun könnte, aber wenn es in den Dokumenten steht, habe ich es verpasst.
Junkyardsparkle
2
Beachten Sie auch, dass in bash 'vs "signifikant ist - bei doppelten Anführungszeichen wird das $von der Shell abgefangen und interpretiert (wie in Jens 'Antwort), aber in dieser Antwort muss es ein einfaches Anführungszeichen sein, damit es von ExifTool intern interpretiert wird.
Bitte lesen Sie mein Profil
2
HINWEIS: Sie sollten im Inkrement-Befehl auch "-fileorder FileName" verwenden, da die Dateien sonst möglicherweise nicht in der erwarteten Reihenfolge gelesen werden.
Junkyardsparkle
3

Versuchen Sie es mit Irfanview . Es ist Freeware (AFAIR) und verfügt über ein sehr flexibles Batch-Umbenennungssystem.

Ansonsten würde ich versuchen, ein Skript zu schreiben, etwas in der Art von

for X in $(seq -w 0 20) ; do
  plus=$(expr $X \* 10)
  exiftool -alldates+="0:0:0 0:0:$plus" image_$X.jpg
done

Die erste Zeile erstellt eine Schleife durch die Zahlen in den Dateinamen, die Sie haben, z. 00..20. Wenn Sie 1000 Bilder haben, wäre der Befehl seq -w 0 1000. Die Option -wfügt den Zahlen führende Nullen hinzu.

Die zweite Zeile definiert in diesem Fall das Inkrement - 10. Bisher ohne Einheiten.

Die Formatzeichenfolge in der dritten Zeile "0: 0: 0 0: 0: $ plus" definiert, was die Variable $plusbedeutet, in diesem Fall Sekunden. Wenn Sie Minuten wollten, würden Sie schreiben 0:0:0 0:$plus:0. Das Format ist "Jahr: Monat: Tag Stunde: Minute: Sekunde". Hier haben wir also ein 10-Sekunden-Inkrement.

Dies ist ein Stapel, der in 'bash' (Linux-Shell) ausgeführt wird. Möglicherweise müssen Sie ihn an Windows anpassen oder ein Linux-Live-System verwenden, um die Konvertierung durchzuführen.

Beachten Sie, dass alle Dateien ein (identisches) Exif-Tag (DateTimeOriginal) haben sollten, bevor dies verwendet werden kann, da nur die vorhandenen Tags erhöht werden. Sie können jedoch einfach ein Tag mit einem exiftool-Befehl schreiben.

Ich habe dies mit 20 Beispieldateien getestet und die Tags wurden korrekt geschrieben.

Jens
quelle
Interessant, dass exiftool mit> 59 im Sekundenfeld arbeitet; cool. Abgesehen davon und da es etwas kürzer und sauberer ist, entspricht dies im Grunde meinem Ansatz, außer dass meiner den Index aus dem Dateinamen analysiert und Ihr Index die Dateinamen aus dem Index generiert. In der praktischen Anwendung, denke ich, ein halbes Dutzend von einem und sechs von dem anderen. :)
Bitte lesen Sie mein Profil
Danke und sehr wahr. Als ich anfing, das herauszufinden, gab es keine Antworten, also waren Sie schneller. :)
Jens
3

Nun, ich habe meine Bash-Antwort nicht veröffentlicht, weil die Frage speziell nach einer Windows-Lösung gestellt wurde, aber da dies zwei andere Personen taten, habe ich mir Folgendes ausgedacht:

for file in *.jpg
do
  exiftool -DateTimeOriginal="1111:11:11 00:00:00" $file
  exiftool -DateTimeOriginal+="00:00:${file:6:4}0" $file
done

Vermeidet das Durcheinander mit dem Datumsbefehl. :) :)

Beachten Sie, dass in dem Teil, in dem es heißt ${file:6:4}, die "6" den Punkt im Dateinamen darstellt, an dem die Sequenznummer beginnt, und die "4" die Länge dieser Sequenz darstellt. Wenn Ihre Dateien genau mit dem in der Frage angegebenen "image-0001.jpg, image-0002.jpg" übereinstimmen, funktioniert dies unverändert. Andernfalls passen Sie es an.

Junkyardsparkle
quelle
Das ist viel cooler als meine Lösung. Aber es kann immer noch ein wenig optimiert werden :), indem das erste Exiftool nur einmal für alle Dateien gleichzeitig aufgerufen und nur der zweite Befehl durchlaufen wird. (Richtig?)
Jens
Ja, das wäre effizienter. : P Wie auch immer, Ihre Antwort ist ein viel besserer Pseudocode für jeden, der tatsächlich versucht, ihn auf DOS oder so weiter zu portieren. Ich kann böse Bashismen nicht vermeiden, um mein Leben zu retten.
Junkyardsparkle
2
"böse Bashims" ist eine Tautologie. : p Aber danke. Eigentlich habe ich mit einem Ruby-Skript angefangen, aber dann wurde mir klar, dass dies ein totaler Overkill sein würde.
Jens
Fantastisch! Ich habe Ihr Beispiel verwendet, um eine Batch-Datei zu schreiben. Da ich keine Codeblöcke in Kommentare schreiben kann, schreibe ich meine eigene Antwort.
Peter
@Peter Ich bin mir nicht sicher, ob dies wirklich die akzeptierte Antwort verdient. Vorausgesetzt, die von StarGeek vorgestellte Methode funktioniert tatsächlich (ich habe sie nicht getestet), ist sie wirklich die beste und tragbarste Lösung.
Junkyardsparkle
3

Da die besten Antworten eine Nicht-Windows-Syntax verwenden, werde ich hier den für Microsoft Windows konvertierten Code veröffentlichen.

@ StarGeek-Lösung, sehr schnell und einfach:

Legen Sie zunächst einen Basiszeitstempel für alle Bilder fest:

exiftool -datetimeoriginal="2015:01:01 12:00:00" DIR

( DIRist der Name des Ordners, der alle Bilder enthält.)

Weisen Sie dann inkrementelle Zeitstempel zu:

exiftool "-datetimeoriginal+<0:0:${filesequence;$_*=3}" DIR

(In diesem Fall 3ist die Anzahl der Sekunden, die Sie zwischen den einzelnen Fotos benötigen.)

Beachten Sie die Verwendung von doppelten Anführungszeichen. Dies ist auf Windows-Systemen erforderlich.


@ junkyardsparkle-Lösung, die anfangs die einzige war, mit der ich arbeiten konnte:

Dies erfordert aufgrund der beteiligten Befehle das Erstellen einer Batchdatei.

@echo off
setlocal EnableDelayedExpansion
for %%f in (*.jpg) do (
    echo %%f
    rem Get filename
    set n=%%f
    rem Extract number
    set n=!n:~6,4!
    rem Interpret as decimal
    set /a n=1!n!-10000
    rem Convert to seconds
    set /a n = n*10
    rem Assign base timestamp
    exiftool -DateTimeOriginal="2000:1:1 00:00:00" %%f
    rem Assign time increment
    exiftool -DateTimeOriginal+="00:00:!n!" %%f
)
Peter
quelle