Uwaga: Poniżej zakłada się, że program ExifTool jest używany w środowisku MS Windows.
Pobierz plik ExifTool.exe
i umieść go w jakimś katalogu
(SomeDir
)
Otwórz wiersz polecenia (przejdź do wyszukiwania systemu Windows, wpisz polecenie cmd i otworzy się okno)
W oknie wiersza polecenia zmień katalog na SomeDir
.
Zdjęcia zrobione z nowoczesnych smartfonów są już geotagowane (jeśli opcja Lokalizacja jest włączona).
Dla aparatów nie wyposażonych w GPS, geotagowanie jest możliwe jeżeli dysponujemy śladem (zarejestrowanym za pomocą zewnętrznego odbiornika GPS.)
Pobierz plik GPX z odbiornika/rejestratora GPS (dokładna procedura
zależy od typu odbiornika GPS) do katalogu SomeDir
.
Zrób zdjęcie odbiornika GPS/ekranu lub wyświetlacza, na którym wyświetlany jest zegar z dokładnym czasem (na przykład ekranu komputera/smartfona).
Wpisz w wierszu poleceń:
exiftool -DateTimeOriginal IMG_20171021_113121.jpg Date/Time Original : 2017:10:29 11:52:46
Wartość taga DateTimeOriginal
określa, że zdjęcie zostało
wykonane o 11:52:46. Dokładny czas odczytujemy ze zdjęcia. Załóżmym
że czas na zdjęciu wynosi 11:50:19 CET. Zatem DateTimeOriginal jest
równe 11:52:46 CET a czas dokładny 11:50:19 CET, stąd różnica 11:32:46
- 11:50:19 = 2min 27s.
Wszystkie odbiorniki GPS wewnętrznie używają/rejestrują wyłącznie używając czasu UTC, nawet jeśli na ekranie pokazywany jest czas lokalny (Por. UTC_offset). Zwykle aparat wewnętrznie korzysta z czasu lokalnego. Jeśli tak jest, należy zadeklarować odpowiednie przesunięcie UTC_offset (w przeciwnym przypadku exiftool używa systemowego przesunięcia czasu względem UTC).
Skopiuj wszystkie zdjęcia do programu SomeDir
.
Wpisz w wierszu poleceń:
exiftool -geosync=-02:27 '-geotime<${DateTimeOriginal}+01:00' -geotag my_gps.log SomeDir
Tag Geotime
określa punkt w czasie dla którego obliczana
jest pozycja GPS. Zapis
-geotime<${DateTimeOriginal}+01:00
oznacza, że pozycja
jest obliczana według czasu z taga DateTimeOriginal
. Zaś
dodanie +01:00
ustala CET jako strefę czasową
(Przesunięcie +01:00 względem UTC)
Tag Geosync dodaje dodatkowy dryft czasu, jak wyjaśniono powyżej.
Opcja -p
służy do generowania plików GPX i/lub KML.
exiftool -fileOrder gpsdatetime -p gpx.fmt SomeDir > SomeTripPhotos.gpx
albo
exiftool -fileOrder gpsdatetime -p kml.fmt SomeDir > SomeTripPhotos.kml
Pliki KML mogą być importowane do Map Google i Google Earth.
Uwaga: jeżeli mapa ma być wyświetlona nie lokalnie, ale na jakimś
serwerze WWW (na przykład:
http://www.gpsvisualizer.com/
), zdjęcia muszą być
przesłane na jakiś serwer, a następnie w pliku KML/GPX należy poprawić
linki do tychże zdjęć. Dokładna procedura zależy od tego, który serwer
jest używany do przechowywania zdjęć.
gpx.fmt
#[HEAD]<?xml version="1.0" encoding="utf-8"?> #[HEAD]<gpx version="1.0" #[HEAD] creator="ExifTool $ExifToolVersion" #[HEAD] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" #[HEAD] xmlns="http://www.topografix.com/GPX/1/0" #[HEAD] xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> #[BODY]<wpt lat="$gpslatitude#" lon="$gpslongitude#"> #[BODY] <name>$directory/$filename</name> #[BODY] <ele>$gpsaltitude#</ele> #[BODY] <desc>$directory/$filename</desc> #[BODY] <link href="$directory/$filename"><type>large</type></link> #[BODY] <link href="$directory/$filename"><type>thumbnail</type></link> #[BODY] <time>$gpsdatetime</time> #[BODY]</wpt> #[TAIL]</gpx>
kml.fmt
#[HEAD]<?xml version="1.0" encoding="UTF-8"?> #[HEAD]<kml xmlns="http://earth.google.com/kml/2.0"> #[HEAD] <Document> #[HEAD] <name>My Photos</name> #[HEAD] <open>1</open> #[HEAD] <Style id="Photo"> #[HEAD] <IconStyle> #[HEAD] <Icon> #[HEAD] <href>http://maps.google.com/mapfiles/kml/pal4/icon38.png</href> #[HEAD] <scale>1.0</scale> #[HEAD] </Icon> #[HEAD] </IconStyle> #[HEAD] </Style> #[HEAD] <Folder> #[HEAD] <name>Waypoints</name> #[HEAD] <open>0</open> #[BODY] <Placemark> #[BODY] <description><![CDATA[<br/><table><tr><td> #[BODY] <img src='$directory/$filename' #[BODY] width='$imagewidth' height='$imageheight'> #[BODY] </td></tr></table>]]></description> #[BODY] <Snippet/> #[BODY] <name>$filename</name> #[BODY] <styleUrl>#Photo</styleUrl> #[BODY] <Point> #[BODY] <altitudeMode>clampedToGround</altitudeMode> #[BODY] <coordinates>$gpslongitude#,$gpslatitude#,0</coordinates> #[BODY] </Point> #[BODY] </Placemark> #[TAIL] </Folder> #[TAIL] </Document> #[TAIL]</kml>
Powyższe łącznie z przykładami można pobrać klikając tutaj.
Note: Below it is assumed that ExifTool is used in MS Windows environment.
Download the ExifTool.exe file and place it in some directory (SomeDir)
Open the Command line (go to windows search, type cmd and the window will open)
In the command line window, change directory to SomeDir.
Photos taken with modern smartphones are already geotagged (if Location option is On.)
If camera is unable to add geocoordinates geotagging is still possible if GPS log is available (registered with some external GPS receiver/logger).
Download the GPX file from your GPS receiver/logger (exact procedure depends on the type of GPS receiver) to SomeDir.
Take picture of GPS receiver/or any screen displaying accurate time (PC/Smartphone screen for example).
Type in command line:
exiftool -DateTimeOriginal IMG_20171021_113121.jpg Date/Time Original : 2017:10:29 11:52:46
So the file was created at 11:52:46 according to DateTimeOriginal
tag.
Exact time is depicted.
and if for example the time depicted (accurate time) is 11:50:19 CET
and DateTimeOriginal is 11:52:46 CET, then
the time difference is 11:32:46 - 11:50:19 = 2min 27s, ie. accurate time is obtained
by substracting 2min 27s from DateTimeOriginal.
All GPS receivers internally use/record UTC time only, even if they diplay local time (cf UTC_offset). Usually the camera internally uses local time. If it is the case one should declare appropriate UTC_offset (otherwise exiftool uses system offset).
Copy all photos to SomeDir.
Type in command line:
exiftool -geosync=-02:27 '-geotime<${DateTimeOriginal}+01:00' -geotag my_gps.log SomeDir
The Geotime tag specifies the point in time for which the GPS position is calculated.
-geotime<${DateTimeOriginal}+01:00
means GPS position is calculated according
to DateTimeOriginal
and it is CET time (+01:00 offset from UTC)
The Geosync tag specifies extra time drift, as explained above.
Exiftool -p
option have to be used to output files
in GPX and/or KML.
exiftool -fileOrder gpsdatetime -p gpx.fmt SomeDir > SomeTripPhotos.gpx
or
exiftool -fileOrder gpsdatetime -p kml.fmt SomeDir > SomeTripPhotos.kml
KML files can be imported to Google maps and or Google earth.
Note: If such a map is not displayed locally
but upload to some WWW server (http://www.gpsvisualizer.com/
in the
case of GPX file for example), photos have to be uploaded to some server first
and then URL to photos fixed. Exact procedure depends on which server is used for
storing photos.
gpx.fmt
#[HEAD]<?xml version="1.0" encoding="utf-8"?> #[HEAD]<gpx version="1.0" #[HEAD] creator="ExifTool $ExifToolVersion" #[HEAD] xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" #[HEAD] xmlns="http://www.topografix.com/GPX/1/0" #[HEAD] xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd"> #[BODY]<wpt lat="$gpslatitude#" lon="$gpslongitude#"> #[BODY] <name>$directory/$filename</name> #[BODY] <ele>$gpsaltitude#</ele> #[BODY] <desc>$directory/$filename</desc> #[BODY] <link href="$directory/$filename"><type>large</type></link> #[BODY] <link href="$directory/$filename"><type>thumbnail</type></link> #[BODY] <time>$gpsdatetime</time> #[BODY]</wpt> #[TAIL]</gpx>
kml.fmt
#[HEAD]<?xml version="1.0" encoding="UTF-8"?> #[HEAD]<kml xmlns="http://earth.google.com/kml/2.0"> #[HEAD] <Document> #[HEAD] <name>My Photos</name> #[HEAD] <open>1</open> #[HEAD] <Style id="Photo"> #[HEAD] <IconStyle> #[HEAD] <Icon> #[HEAD] <href>http://maps.google.com/mapfiles/kml/pal4/icon38.png</href> #[HEAD] <scale>1.0</scale> #[HEAD] </Icon> #[HEAD] </IconStyle> #[HEAD] </Style> #[HEAD] <Folder> #[HEAD] <name>Waypoints</name> #[HEAD] <open>0</open> #[BODY] <Placemark> #[BODY] <description><![CDATA[<br/><table><tr><td> #[BODY] <img src='$directory/$filename' #[BODY] width='$imagewidth' height='$imageheight'> #[BODY] </td></tr></table>]]></description> #[BODY] <Snippet/> #[BODY] <name>$filename</name> #[BODY] <styleUrl>#Photo</styleUrl> #[BODY] <Point> #[BODY] <altitudeMode>clampedToGround</altitudeMode> #[BODY] <coordinates>$gpslongitude#,$gpslatitude#,0</coordinates> #[BODY] </Point> #[BODY] </Placemark> #[TAIL] </Folder> #[TAIL] </Document> #[TAIL]</kml>
The above with examples can be download from here
Jak zmienić błędny czas wykonania serii zdjęć, co się może zdarzyć gdy zapomni się ustawić
zegar w aparacie?
Wykorzystując exiftool
jest to bardzo proste.
Należy umieścić
wszystkie trefne pliki w pewnym katalogu a następnie wykonać polecenie:
exiftool "-DateTimeOriginal+=5:6:21 10:18:20" katalog
lub lepiej:
exiftool -AllDates-=1 katalog exiftool -AllDates-=11:20:11 katalog
Pierwsze przesunie (w każdym pliku) datę wykonania zdjęcia (DateTimeOriginal
) o 5 lat, 6 miesięcy,
21 dni, 10 godzin, 18 minut oraz 20 sekund w przód.
Drugie polecenie przesuwa
o godzinę do tyłu wartości trzech pól:
DateTimeOriginal
, CreateDate
oraz ModifyDate
.
Trzecie przesuwa tak samo jak drugie, tylko przesuwa o 11 godzin, 20 minut oraz 11 sekund.
Manipulowanie wpisami EXIF jest dobrze opisane w dokumentacji, exiftool więc to co powyżej nie jest żadną rewelacją.
Dziś usiłowałem w ten sposób poprawić czas zdjęć zrobionych aparatem z nie ustawionym zegarem (same zera w dacie/czasie). I się nie dało, tzn.
exiftool "-DateTimeOriginal+=2010:5:11 16:00:00" katalog
Zwracał błąd (że miesiąc ma numer -1
). Zadziałało za to:
exiftool "-DateTimeOriginal=2010:5:11 16:00:00" katalog
tj. bez plusa przed znakiem równości
Przy okazji: The Olympus file format is Pmddnnnn.jpg where: m is month 1-9A-C, dd is day 0--31, nnnn is number 0000-9999. The P is fixed for all Olympus Cameras. Z tego by wynikało, że moje przekonanie, że nazwy plików się nie powtarzają nie jest oparte na prawdzie.
Jest problem z opisami EXIF niektórych zdjęć robionych szerokokątnym
obiektywem Olympus Zuiko Digital 11--22 f/2.8-3.5. Niektórymi żeby było śmieszniej
-- widocznie zależy to od nastaw. Otóż
jeżeli synchronizuję zdjęcia ze śladem GPS za pomocą
gpsPhoto.pl
, to pojawia się komunikat:
error: [minor] Bad MakerNotes directory
Komunikat generuje jakaś procedura z pakietu
Image::ExifTool
,
wykorzystywana przez gpsPhoto.pl
.
Po aktualizacji exiftool do 8.06 o tyle się sytuacja zmieniła, że
komunikat jest inny:
error: [minor] Bad EquipmentIFD directory.
Gdybym korzystał ze skryptu exiftool
, to błąd można zignorować
dodając opcję -m
przy uruchamianiu skryptu.
Ale ja używam gpsPhoto.pl
,
które z kolei korzysta z perlowego pakietu Image::ExifTool
. Żeby nie
modyfikować gpsPhoto.pl
(beznadziejna na oko sprawa),
poprawiam wpisy EXIF poniższym programem w Ruby.
Słowo poprawiam oznacza
dokładnie tyle, że poprawne wpisy są przepisane a błędne zignorowane.
Otrzymane w rezultacie opisy EXIF są niekompletne. Opcja -m
działa
dokładnie identycznie.
#! /usr/bin/ruby # fix_tags.rb by Sijmen Mulder <sjmulder@gmail.com> in 2008. Public domain. files = Dir.glob("*.JPG").concat Dir.glob("*.jpg") files.each do |file| commands = [ "cp #{file} #{file}_original", "exiftool -overwrite_original -q -exif:all= \"#{file}\"", "exiftool -overwrite_original -q -q -tagsfromfile \"#{file}_original\" --MakerNotes \"#{file}\" " ] puts(file) commands.each do |c| #puts(c) system(c) end end puts "Processed #{files.length} file(s)."
Powyższy skrypt kopiuje każdy plik .jpg
z bieżącego katalogu,
a następnie wstawia do kopii wyłącznie poprawne wpisy EXIF z pliku oryginalnego.
Program jest w Ruby bo znaleziono go w sieci. Można by przerobić w innym języku ale mi się nie chce
Cała procedura jest taka sobie,
bo poprawione pliki .jpg
zawierają niekompletne
opisy EXIF, ale póki co nic lepszego nie wymyśliłem.
To była ciekawa wycieczka. Zwiedzaliśmy okolice Świdnicy oraz byliśmy na Śnieżce i w Górach Stołowych (Szczeliniec/Teplice). Wracając z Teplic zwiedziliśmy klasztor w Broumovie.
Doszło do niewielkiego bałaganu w zbiorze zdjęć przywiezionych
z tygodniowego pobytu w Świdnicy. Zdjęcia z kilku dni przegrałem do
jednego katalogu i hop, bez zbędnego myślenia uruchomiłem skrypt
gpsPhoto.pl
aby dodać współrzędne geograficzne. Po tej
operacji czas modyfikacji każdego pliku ze zdjęciem się zmienił no
i był mały kłopot z szybkim ustaleniem w którym dniu dane zdjęcie było
zrobione. Oczywiście ta informacja nie została utracona, bo jest
wartością pola DateTimeOriginal
, tyle że ,,z poziomu''
wiersza poleceń tego nie widać.
Już chciałem jakiś skrypt klecić żeby pobierał
DateTimeOriginal
a następnie zmieniał czas modyfikacji
pliku, ale w dokumentacji
exiftool
znalazłem gotowy przykład dokładnie robiący to, co chciałem osiągnąć:
exiftool "-Directory<DateTimeOriginal" -d "%Y-%m-%d" KATALOG
Powyższe przeniesie wszystkie pliki .jpeg
z katalogu KATALOG do katalogów o nazwach
postaci rok-miesiąc-dzień.
Daty modyfikacji pliku to nie zmienia, ale samo uporządkowanie
w odpowiednich katalogach w zupełności mi wystarczy.
Mój GPS Logger (używam Iblue 747) dwa razy zarejestrował ślad zawierający kolosalne odchylenie (biegun północny, tj. lat="90.000000000" lon="0.000000000"). Wcześniej nie obserwowałem tego fenomenu, tj. mówiąc dokładnie Etrex H nagminnie oszukuje podając np. średnią/maksymalną prędkość, ale zwykle zgrany ślad jest OK. Próbowałem poszukać jakiś automatycznych sposobów usunięcia takich anomalii ale nie znalazłem. Ostatecznie problem jest źle zdefiniowany więc automatem się nie da. Potrzebny jest edytor i wizualna inspekcja (np. MapSource ale to wyłącznie windziana aplikacja). Z braku takowego ślad wyświetlam na Google Maps a rażące odchylenia usuwam patrząc na współrzędne. Na moje potrzeby super korekta śladu nie jest potrzebna. Tak nawiasem mówiąc wspólnym mianownikiem Loggera i Etrexa jest chip firmy MTK. Ciekawe czy wszystkie czułe GPSy typu Sirf3/MTK robią takie błędy czy tylko MTK?
Ślady w formacie KML ze zdjęciami umieściłem tutaj: świdnica--książ | wlk.sowa--ludwikowice | szczeliniec--wambierzyce | karpacz--śnieżka | kompleks--osówka+zamek grodno | teplice--broumov | ślęża--tąpadła--sulistrowiczki