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
The problem: upload photos to Picasa (trivial); 2) scale them if neccessary before upload; 3) if photos contains some EXIF tags (geotags in particular) copy these tags to Picasa as well.
To achieve the above I use: googleCL
(upload),
convert
(from ImageMagick bundle for scaling)
exiftool
(for metadata extraction/manipulation).
Using convert
the script below
(jpgresize.sh
) scale picture to 2048 pixels along longest
side:
#!/bin/bash # Scale pictures to 2048 pixels along longest side for upload to Picasa # Photos below 2048 x 2048 pixels do not count towards storage limit # (cf. https://support.google.com/picasa/answer/6558?hl=en ) # PICASA_FREE_LIMIT=2048 while test $# -gt 0; do case "$1" in -o) shift; OUT_FILE="$1";; -o*) OUT_FILE="`echo :$1 | sed 's/^:-o//'`";; *) FILE="$1";; esac shift done if [ -z "$OUT_FILE" ] ; then my_pic="${FILE%.*}_s.${FILE#*.}" else my_pic="$OUT_FILE"; fi if [ -f "$FILE" ] ; then echo "** converting $FILE to $my_pic ***" SIZE="2048x" my_pic_width=`exiftool -ImageWidth "$FILE" | awk '{print $NF}'` my_pic_height=`exiftool -ImageHeight "$FILE" | awk '{print $NF}'` if [[ ( -z "$my_pic_width" ) || ( -z "$my_pic_height" ) ]] ; then echo "*** $FILE has 0 width and/or height ***"; exit ; fi ## http://www.imagemagick.org/Usage/resize/#resize if [[ ( "$my_pic_width" -gt "$PICASA_FREE_LIMIT" ) || \ ( "$my_pic_height" -gt "$PICASA_FREE_LIMIT" ) ]] ; then if [ "$my_pic_width" -gt "$my_pic_height" ] ; then SIZE="${PICASA_FREE_LIMIT}x>" echo "*** $FILE width: $my_pic_width ; converting to $SIZE" convert "$FILE" -geometry $SIZE "$my_pic" else SIZE="x$PICASA_FREE_LIMIT>" echo "*** $FILE height: $my_pic_height ; converting to $SIZE" convert "$FILE" -geometry $SIZE "$my_pic" fi else ## File is too small copy the original: echo "*** $FILE has $my_pic_width in width; COPYING" cp "$FILE" "$my_pic" fi else echo "*** FILE $FILE not found! ***" fi
Upload one picture to picasa with 1photo2picasa.sh
#!/bin/bash # # Upload photo to Picasa with googleCL # It is assumed the photo contains UserComment GPSLatitude GPSLongitude GPSAltitude # Exif tags which are copied to Picasa (see below for more details) # # Default album title: ALBUMTITLE="???" echo "$0 -a AlbumTitle FILE-2-UPLOAD" while test $# -gt 0; do case "$1" in -a) shift; ALBUMTITLE="$1";; -a*) ALBUMTITLE="`echo :$1 | sed 's/^:-a//'`";; *) FILE="$1";; esac shift done AUTHOR=`exiftool -S -Artist $FILE` if [ -z "$AUTHOR" ] ; then # It there is no Artist tag it is assumed photo was not tagged properly echo "*** ERROR: $FILE lacks Artist EXIF tag" exit; else ## Some tags are edited: TAGS=`exiftool -S -UserComment $FILE | awk '{ $1=""; for (i=1;i<=NF;i++) { if ($i ~ /http/) { $i=""}}; \ gsub (/, +/, ",", $0); gsub (/ +,/, ",", $0); gsub (/^ +| +$/, "", $0); print $0}'` GPSLat=`exiftool -S -c '%+.6f' -GPSLatitude $FILE | awk '{ print $2}'` GPSLon=`exiftool -S -c '%+.6f' -GPSLongitude $FILE | awk '{ print $2}'` GPSAlt=`exiftool -GPSAltitude $FILE -S -c "%.1f" | awk '{ if ($0 ~ /Below/) { print -$2} else {print $2}}'` PICASA_TAGS="" ## Concatenate all tags if [ -n "$TAGS" ] ; then PICASA_TAGS="$TAGS"; fi if [ -n "$GPSLat" ] ; then PICASA_TAGS="$PICASA_TAGS,geo:lat=$GPSLat"; fi if [ -n "$GPSLon" ] ; then PICASA_TAGS="$PICASA_TAGS,geo:lon=$GPSLon"; fi if [ -n "$GPSAlt" ] ; then PICASA_TAGS="$PICASA_TAGS,geo:alt=$GPSAlt"; fi # Upload to picasa: google picasa post --title "$ALBUMTITLE" --src="$FILE" --photo="$FILE" --tags="$PICASA_TAGS" fi
Finally simple bash script upload2picassa.sh
uses
jpgresize.sh
and 1photo2picasa.sh
to upload all .jpg
files from the
current directory to picasa:
#!/bin/bash # Upload all .jpg files (scaled tp 2048) to picasa # echo "Uploading all .jpg files to album: $albumtitle" albumtitle=$1 if [ -z "$albumtitle" ] ; then echo "Podaj ID albumu!"; exit 1 fi for file in *.jpg; do echo "Uploading $file to $albumtitle album..." outfile="${file%.*}_s.${file#*.}" jpgresize.sh -p -o $outfile $file && 1photo2picasa.sh -a $albumtitle $outfile done
Pojechaliśmy na Warmię (niem. Ermland) na dwa dni (2--3 maja) zwiedzając Pasłęk, Ornetę, Dobre Miasto i Lidzbark Warmiński (zdjęcia są tutaj).
W Ornecie Misiek upuścił aparat (w torbie i z niewielkiej wysokości) tak nieszczęśliwie, że uszkodził się dekiel i stłukł filtr nakręcony na obiektyw. Sam obiektyw (Olympus Zuiko 12-60 mmm) wydaje się intact. Filtr z kolei był tani--jakaś Hoya UV/72mm za 40 PLN. Zatem straty minimalne, ale... Ale nie szło odkręcić oprawki filtra. Próbowałem nawet to złapać kombinerkami za brzeg (szkła już nie było więc było więcej miejsca) i guzik...
Szukając pomocy wpisałem do Google hoya filter stuck. Problem generalnie jest znany i proponowane są różne rozwiązania:
Uff...
Moje najbardziej oblegane zdjęcie na flickr.com. niedługo będzie miało jubileusz 2000 oglądnięć (przeciętna dla całego mojego zbioru to ok. 10 odsłon). Ponad 50 użytkowników zaznaczyło je jako ulubione. Tylko hmm... upodobania tych użytkowników takie trochę...
Wyświetlanie zdjęć zrobionych w pobliżu innego zdjęcia na flickr.com jest łatwe, ale ta funkcja jakoś mi umknęła do tej pory a jest przydatna. Na przykład żeby się nie `zapętlić' i robić zdjęcie tego co już było sfotografowane. Otóż przykładowo:
http://www.flickr.com/photos/tprzechlewski/3087051333/
Pokazuje stronę ze zdjęciem. Natomiast
http://www.flickr.com/photos/tprzechlewski/3087051333/nearby
Ze zdjęciami zrobionymi obok tego zdjęcia. Oczywiście zdjęcie musi być geotagowane żeby powyższe zadziałało.