W tym tekście opiszę w jaki sposób wysyłam swoje zdjęcia na
Wikimedia Commons stosując
lekko podrasowany skrypt
Erika Möllera
(wersja oryginalna).
Po pierwsze należy zarejestrować się na Wikimedia Commons
(w sposób opisany na podanej wyżej
stronie).
Potem zmodyfikować skrypt, nadając odpowiednie wartości zmiennym
$username
oraz
$password
, znajdującym się na początku skryptu.
Teraz należy skopiować wszystkie obrazki
do katalogu i uruchamiać skrypt (,,z poziomu'' katalogu nadrzędnego)
w następujący sposób:
perl upld2wc.pl katalog
W wyniku działania skryptu powstanie zaślepkowy plik files.txt, który wygląda jakoś tak:
>plik1.jpg {{Information |Description= [[:pl:Sopot|Sopot]], Poland |Source=own work |Date=2007 |Author=Tomasz Przechlewski |Permission={{cc-by-2.5}} }} >plik2.jpg {{Information |Description= [[:pl:Sopot|Sopot]], Poland |Source=own work |Date=2007 |Author=Tomasz Przechlewski |Permission={{cc-by-2.5}} }} ...
Teraz trzeba dodać/zmodyfikować opis do każdego rysunku (wiersz
Description
); następnie należy uruchomić skrypt powtórnie:
perl upld2wc.pl katalog
Jakoś nie mogę się przekonać do używania Unicode (nie mam też
specjalnie do tego motywacji -- jeden bajt cały czas mi wystarcza), dlatego
skrypt ,,oczekuje'', że plik files.txt
jest kodowany
w wariancie iso-8859-2, natomiast to co jest
wysyłane na Wikimedia Commons jest w Unikodzie.
Zdjęcia zrobione w trybie pionowym trzeba oczywiście obrócić.
Do tego celu używam programu jpegtran, ale taki sposób żeby
zostały zachowane metadane
EXIF.
Do modyfikowania metadanych EXIF używam programu exiv2
:
# kompletny skrypt jest tutaj exiv2 ex plik-we.jpg # zapisuje EXIF w pliku plik-we.exv jpegtran -rotate 90 plik-we.jpg > plik-wy.jpg # obrót mv plik-we.exv plik-wy.exv # zmiana nazwy exiv2 -in plik-wy.jpg # wstawia EXIF do obróconego pliku
W podręczniku programu exiv2 błędnie podane jest exiv2 -it
zamiast exiv2 -in
.
Uwaga: podanie exiv2 -pt
powoduje wyświetlenie wszystkich
metadanych.
Zamiast jpegtran można spróbować skorzystać z programu exiftran,
który potrafi obrócić obrazek z zachowaniem metadanych.
Program exiftran znajduje się w archiwum fbida
(przynajmniej
w dystrybucji FC5).
Wreszcie nie zawadzi dodać informacje dotyczące autora/licencji do
samego pliku ze zdjęcie modyfikując odpowiednie pola EXIF,
w tym przypadku Exif.Image.Artist
oraz Exif.Image.Copyright
:
# kompletny skrypt jest tutaj exiv2 -M"set Exif.Image.Copyright Licence: CC Attribution" \ -M"set Exif.Image.Artist Creator: Tomasz Przechlewski" plik
BTW: do manipulowania metadanymi EXIF w skryptach Perla służy świetny
pakiet Image::ExifTool
. (Por. Mój
sposób na dodawanie zdjęć na flickr.com).
Dopisane 21 lutego 2008:
Exiv2 jest do kitu, a co najmniej niepotrzebny. Zdjęcie można
obrócić dużo prościej. Zamiast mnożyć byty w postaci skryptów
basha, My_jpeg_rot
(BTW znak minus w nazwach jest
niepoprawny w bashu) jest funkcją, którą
należy umieścić w ~/.bash_profile
:
# Obrót pliku .jpg z zachowaniem metadanych EXIF # wykorzystanie: My_jpeg_rot [-l -r -u] plik function My_jpeg_rot () { ROT="90" while test $# -gt 0; do case "$1" in -l) ROT="90" ;; -r) ROT="270" ;; -u) ROT="180" ;; *) FILE="$1" ;; esac shift done if [ "$FILE" = "" ] ; then echo " *** Podaj nazwę pliku ***" else f=`basename $FILE .jpg` jpegtran -rotate 90 -copy all -outfile "${f}_r".jpg "$f".jpg # clear rotation/orientation so that some viewers (e.g. Eye # of GNOME) won't be fooled jhead -norot "${f}_r".jpg fi unset FILE ROT f }
Zobacz też HOWTO: Rotate JPG images in GNOME's Nautilus File Manager.
Podobnie skrypt dodający informacje dotyczące autora/licencji
zmieniłem na program w Perlu wykorzystujący doskonały moduł
Image::ExifTool
zamiast exiv2:
#!/usr/bin/perl -w # Wykorzystnie: $0 [-l licencja ][-c autor] plik1 plik2 ... use strict; use Image::ExifTool; use Getopt::Long; my $credentials = "Creator: Tomasz Przechlewski"; my $license_stmt = "Licence: CC Attribution"; my $help = 0; GetOptions( 'help' => \$help, 'credentials=s' => \$credentials, 'license=s' => \$license_stmt,); if ($help) { print "$0 [-l cpr_notice][-c creator] file1 file2 ...\n"; exit 0 ;} my $eT = new Image::ExifTool; while( my $photo = shift @ARGV ) { $eT->ExtractInfo($photo); #add_more_exif($exifTool); $eT->SetNewValue(Artist => "$credentials"); $eT->SetNewValue(Copyright => "$license_stmt"); # rewrite Photo to update Exif: $eT->WriteInfo($photo); print "Done: $photo $credentials $license_stmt\n"; } ## -- end --