Spørsmål:
Hvordan kan jeg trinnvis datere bilder?
Peter
2015-02-21 02:49:20 UTC
view on stackexchange narkive permalink

Jeg har en samling bilder som ikke har datoinformasjon. De har ingen Exif-data, og datoene for filendring er alle identiske. Den eneste sekvensen er i filnavnet: image-0001.jpg, image-0002.jpg, etc.

Nå vil jeg tildele en dato til disse filene (helst i Exif) som alle er 10 sekunder fra hverandre. Jeg er ikke så interessert i hva nøyaktig basisdatoen og klokkeslettet vil være, bare at de øker 10 sekunder. Så det første bildet får 0:00:00, det andre 0:00:10, det tredje 0:00:20 osv.

Er dette mulig med ExifTool eller andre Windows-applikasjoner? Vi snakker om flere tusen bilder, så det er uaktuelt å gjøre dette manuelt ;-)

Fire svar:
StarGeek
2015-02-22 23:53:14 UTC
view on stackexchange narkive permalink

Det er allerede et lignende spørsmål på ExifTool-forumene. Det kan gjøres ved hjelp av to sekvensielle ExifTool-kommandoer. Først må du sørge for at hele datoen til den samme

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

Og så øk tiden på hver

  exiftool '-datetimeoriginal + <0: 0: $ {filesequence} 0' DIR  
Hei StarGeek. Hvordan er dette svaret forskjellig fra junkyardsparkles?
@Bart, her er `$ filesequence` en magisk exiftool-variabel; i junkyardsparkle er `$ file 'en bash-variabel. Dette er mer bærbart; den andre knytter tiden til filnavnet i stedet for ordren exiftool tilfeldigvis leser dem.
Ryddig. Jeg hadde en følelse av at exiftool kunne gjøre noe sånt, men hvis det er i dokumentene, så savnet jeg det.
Jeg kan ikke få dette til å fungere. Jeg bruker `exiftool" -datetimeoriginal + <0: 0: $ filesequence "image-0010.jpg` (i DOS-format), men resultatet er" 0 bildefiler oppdatert, 1 bildefiler uendret "
Kan denne kommandoen endres hvis jeg vil ha 3 sekunder mellom hvert bilde?
@Peter Testen din fungerer ikke fordi `$ filesequence` starter ved 0. Når du bare har en fil, er den _ bare_ noen gang satt til 0, noe som gjør det hele til en no-op. Det skal fungere hvis du har en hel katalog med filer.
Vær også oppmerksom på at i bash er `` vs '' `` viktig - med doble anførselstegn vil '$' bli fanget og tolket av skallet (som i Jens 'svar), men i dette svaret må det være et enkelt sitat så det tolkes av ExifTool internt.
MERKNAD: Du bør også bruke "-fileorder FileName" i inkrementskommandoen, ellers kan det hende at filene ikke blir lest i forventet rekkefølge.
@Peter, Å endre det til intervaller på 3 sekunder er mulig, men litt mer komplisert. Du må bruke `-datetimeoriginal + <0: 0: $ {filesequence; $ _ * = 3}` (tannregulering kreves). På det tidspunktet begynner du å bruke avansert formatering og glir litt perl-kode der inne.
En ting til å legge til er at hvis du kjører disse kommandoene i en katalog (ubrukelig for å kjøre på enkeltfiler som @mattdm påpekte), vil dette være mye raskere ettersom ExifTool kun blir påkalt en gang for hver kommando. Enhver looping må påkalle den for hver fil, og oppstarten hver gang vil være et stort ytelseshit.
Ah, jeg var under inntrykk av at $ filesequence hentet nummeret fra filnavnet, men det ser faktisk på katalogsorteringsrekkefølgen. I Microsoft Windows-ledeteksten må vi også bruke `` '' i stedet for ``. Men nå fungerer det perfekt!
Jens
2015-02-21 03:45:55 UTC
view on stackexchange narkive permalink

Prøv Irfanview. Det er freeware (AFAIR) og har et veldig fleksibelt batch-omdøpningssystem.

Annet enn det, ville jeg prøve å skrive et skript, noe i retning av

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

Den første linjen oppretter en gå gjennom tallene i filnavnene du har, f.eks. 00..20. Hvis du har 1000 bilder, vil kommandoen være seq -w 0 1000 . Alternativet -w legger til ledende nuller til tallene.

Den andre linjen definerer trinnet - 10 i dette tilfellet. Uten enheter så langt.

Formatstrengen i tredje linje "0: 0: 0 0: 0: $ plus" definerer hva variabelen $ plus betyr, i dette tilfellet sekunder. Hvis du ville ha minutter, skrev du 0: 0: 0 0: $ plus: 0 . Formatet er "år: måned: dag time: minutt: sekund". Så her har vi en økning på 10 sekunder.

Dette er en batch gjort i 'bash' (Linux-skall), du må kanskje tilpasse den til Windows eller bruke et live Linux-system for å gjøre konverteringen.

Merk at alle filene skal ha en (identisk) Exif-tag (DateTimeOriginal) før denne kan brukes, siden den kun øker de eksisterende kodene. Men du kan ganske enkelt skrive en tag med en exiftool-kommando.

Jeg testet dette med 20 eksempelfiler, og kodene ble skrevet riktig.

Interessant at exiftool fungerer med> 59 i sekunder-feltet; kul. Annet enn det, og å være litt kortere og renere, er dette i utgangspunktet det samme som min tilnærming, bortsett fra at min analyserer indeksen fra filnavnet og din genererer filnavn fra indeksen. I praktisk anvendelse, tror jeg et halvt dusin av det ene og seks av det andre. :)
Takk, og veldig sant. Da jeg begynte å finne ut av det var det ingen svar, så du var raskere. :)
junkyardsparkle
2015-02-21 04:35:50 UTC
view on stackexchange narkive permalink

Vel, jeg la ikke ut mitt bash-svar fordi spørsmålet spesifikt ble stilt om en Windows-løsning, men siden to andre personer gjorde det, er det jeg fant på:

  for fil i * .jpgdo exiftool -DateTimeOriginal = "1111: 11: 11 00:00:00" $ file exiftool -DateTimeOriginal + = "00:00: $ {file: 6: 4} 0" $ arkivert  

Unngår å rote med dato-kommandoen. :)

Merk at i delen der det står $ {file: 6: 4} , representerer "6" punktet i filnavnet der sekvensnummeret starter, og "4" representerer lengden på den sekvensen. Hvis filene dine samsvarer nøyaktig med "image-0001.jpg, image-0002.jpg" gitt i spørsmålet, vil dette fungere som det er; ellers kan du justere for å matche.

Det er mye kulere enn løsningen min. Men det kan * fremdeles * være litt optimalisert :) ved å ringe den første exiftool bare en gang på alle filene på en gang og bare gå gjennom den andre kommandoen. (Ikke sant?)
Ja, det ville være mer effektivt. : P Uansett, svaret ditt er mye bedre pseudokode for alle som faktisk prøver å portere den til DOS eller hva ikke. Jeg ser ikke ut til å unngå onde bashismer for å redde livet mitt.
"onde bashimer" er en tautologi. : p Men takk. Jeg startet faktisk med et Ruby-skript, men så skjønte jeg at dette ville være total overkill.
Fantastisk! Jeg har brukt eksemplet ditt til å skrive en batchfil. Siden jeg ikke kan skrive kodeblokker i kommentarer, vil jeg skrive mitt eget svar.
@Peter Jeg er ikke sikker på at dette virkelig fortjener å være det aksepterte svaret, skjønt ... forutsatt at metoden presentert av StarGeek faktisk fungerer (jeg har ikke testet det), er det virkelig den beste, mest bærbare løsningen.
Peter
2015-02-23 04:00:37 UTC
view on stackexchange narkive permalink

Siden de beste svarene bruker ikke-Windows-syntaks, vil jeg her legge koden deres om til Microsoft Windows.

@StarGeek-løsning, veldig rask og enkel:

Sett først en grunntidsstempel til alle bilder:

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

( DIR er navnet på mappen som inneholder alle bildene.)

Tildel deretter trinnvise tidsstempler:

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

(I dette tilfellet er 3 antall sekunder du vil ha mellom hvert bilde.)

Merk bruk av doble anførselstegn, dette kreves på Windows-systemer.


@junkyardsparkle-løsning, som i utgangspunktet var den eneste jeg klarte å jobbe med:

Dette krever å opprette en batchfil på grunn av de involverte kommandoene.

  @echo offsetlocal EnableDelayedExpansionfor %% f in (* .jpg) do (echo %% f rem Få filnavn satt n = %% f rem Extract tallsett n =! n: ~ 6,4! rem I nfortolke som desimalsett / an = 1! n! -10000 rem Konverter til sekunder sett / an = n * 10 rem Tildel basis tidsstempel exiftool -DateTimeOriginal = "2000: 1: 1 00:00:00" %% f rem Tildel tid inkrement exiftool -DateTimeOriginal + = "00: 00:! n!" %% f)  


Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...