Erinevus lehekülje "Fotoarhiivide haldamine" redaktsioonide vahel

Allikas: Jaanuse wiki
Jump to navigation Jump to search
 
70. rida: 70. rida:
 
  mogrify -auto-orient <faili nimi>
 
  mogrify -auto-orient <faili nimi>
  
Kui pildis EXIF infot ei ole või seal on juba kirjas "Orientation=1", siis ei tehta midagi. Muul juhul keeratakse pildi pikslid vastavalt "Orientation=..." infole ja "nullitakse" EXIFis asend "Orientation=1" peale. Tasub mainida, et kuigi JPG on '''kadudega''' pakkimismeetod, siis 90 ja 180 kraadised pöörded teostatakse '''kadudeta'''. Seega on pildid nüüd ilusti ja igal pool vaadatavad.
+
Kui pildis EXIF infot ei ole või seal on juba kirjas "Orientation=1", siis jääb pildi asend paika. Muul juhul keeratakse pildi pikslid vastavalt "Orientation=..." infole ja "nullitakse" EXIFis asend "Orientation=1" peale. Seega on pildid nüüd ilusti ja igal pool vaadatavad.
  
 
Tasub siiski veel mainimist, et:
 
Tasub siiski veel mainimist, et:
 +
* Tasub mainida, et teoreetiliselt saab JPG failides 90- ja 180-kraadiseid pöördeid teha ka kadudeta. Samas selgus, et ''mogrify'' (nagu ka kõik muud ''ImageMagick'' paketti kuuluvad tööriistad) kodeerib JPG failid siiski ringi (ning seda isegi juhul kui algses failis oli "Orientation=1"), vähendades nende mahtu. Ilmselt see siiski eriliseks probleemiks ei ole - tänapäevased fotokad annavad enamasti välja rohkem piksleid kui ekraanile mahub ning ilmselt on ringi pakkimine siiski üsna väikse mõjuga. Alternatiivina sai proovitud ka ''jpegtran'' nimelist tööriista, mis peaks suutma JPG faile ilma ringi kodeerimata pöörata. Samas tulid ka sellega mingid veidrused välja:
 +
** Esiteks suudab ta täiesti probleemivabalt pöörata ainult pilte, mille suurus on 8 (või mingitel juhtudel 16) kordne arv piksleid mõlemas suunas. Aga see pole enamasti probleem.
 +
** Teiseks tegi ka see programm JPG failid väiksemaks. Ehk on tegemist hoopis mingi ballastiga, mille nii ''mogrify'' kui ''jpegtran'' eemaldasid?
 +
** Lõpuks tundub aga, et EXIF info üle kandmine ei ole ''jpegtran''-i puhul päris lõpuni hea. Nimelt läks ''thumnail'' kaduma vaatamata -copy all valikule (mis peaks kõik EXIF info säilitama), samas mingid pointerid jäid ripakile, nii et edaspidi hakkab ''exiftool'' selle pildi peale hoiatusi pilduma.
 
* Mogrify muudab ära faili viimati muudetud kuupäevad. Need saab soovi korral vastavalt EXIF infole taastada [[#Failide_viimati_muudetud_kuup.C3.A4ev|nii]].
 
* Mogrify muudab ära faili viimati muudetud kuupäevad. Need saab soovi korral vastavalt EXIF infole taastada [[#Failide_viimati_muudetud_kuup.C3.A4ev|nii]].
* Kui pilt sisaldas ka ''thumbnail''-i, siis seda ''Mogrify'' ei puutu, küll aga "nullitakse" ära ka "thumbnail:Orientation=1" parameeter. ''Thumbnail''-i enda uuendamine on täiesti omaette teema.
+
* Kui pilt sisaldas ka ''thumbnail''-i, siis seda ''Mogrify'' ei puutu, küll aga "nullitakse" ära ka "thumbnail:Orientation=1" parameeter. Kommentaar 2022: nüüd tundub, et ''thumbnail''-i orientatsioon jääb pärast ''mogrify'' jooksutamist siiski paika. ''Thumbnail''-i enda uuendamine on täiesti omaette teema.
  
 
=== Orientatsiooni info eemaldamine ===
 
=== Orientatsiooni info eemaldamine ===

Viimane redaktsioon: 21. november 2022, kell 19:32

Sissejuhatus

Käesolev artikkel koondab märkmeid, mis on seotud fotoarhiivide haldamisega. Näiteks probleemid ja võimalused, mis on seotud:

  • Pildi pööramisega.
  • Pildivaaturitega.
  • EXIF info.
  • Thumbnail'id.
  • Failide viimati muudetud kuupäev.
  • jne.

Kasutatavad tööriistad

Allpool toodud skriptid ja näited kasutavad kahte tarkvaralist tööriista. Mõlemad nad on käsurea utiliidid, mis on olemas nii Windowsile kui Linuxile. Seega tasub alustuseks nad alla laadida ning paigaldada:

  • ImageMagick - võimaldab teha pilditöötluse operatsioone.
  • ExifTool - võimaldab EXIF infoga majandada. Vähemalt Windowsi versioonis installeerida polnud vaja, lihtsalt laadida EXE alla ja saab kasutama hakata.

Tasub mainida, et kuigi allpool olevad katsed said tehtud Windowsi peal, siis tegelikult tasub tulevikus pigem Linuxile üle minna. Esiteks on Linuxil skriptimise võimalused (ning ka võimalused erinevate olukordade kohta foorumitest jms infot koguda) oluliselt laiemad ning teiseks saab failinimedes kasutada läbivalt UTF-8 kodeeringut. Windowsi käsurea kodeeringute teema on pehmelt öeldes üle võlli ning kui mingeid failide nimekirju tahta hallata vahelduva eduga nii käsurea utiliitide kui tekstitöötlusprogrammidega, siis pidevad probleemid täpitähtedega on selle protsessi lahutamatu osa.

Tasub veel tähelepanu juhtida, et kuna failide nimed võivad tihti ka tühikuid sisaldada, siis tark on nii käsureal, eriti aga skriptides faili nimele (või seda tähistavale muutujale) jutumärgid ümber panna.

Pildi pööramine

Sissejuhatus

On kaks võimalikku lähenemist, kuidas JPG fail arvutis vaadates õiget pidi välja paistab:

  • Variant 1: pikslid ongi kohe õiges asendis. Näiteks kui fotoaparaat annab landscape-na pildistades välja pildi formaadid 1920x1080 pikslit, siis portrait-is annab 1080x1920.
  • Variant 2: pikslid on alati samas formaadis (nt 1920x1080) ning pööramise info lisatakse EXIF infona.

EXIF info kuvamine

Seda, milline pööramise info pildi EXIF alale lisatud on, oskavad näidata nii ImageMagick paketti kuuluv Identify kui ka exiftool nimeline tööriist. Seejuures tundub, et vähemalt olemasoleva info näitamise osas tasub kasutada pigem Identify-d. Tundub, et exiftool ei saa hakkama pildi sisse integreeritud thumbnail pisipildi orientatsiooni infoga. Seejuures ei toimi exiftool selles osas alati korrektselt isegi juhtudel, mil kasutaja soovibki kuvada ainult päris pildi orientatsiooni infot ning teda ei huvita thumbnail-i orientatsioon. Nimelt kuigi normaalolukorras kuvab exiftool põhipildi orientatsiooni info korrektselt või siis ei kuva üldse, kui seda lisatud ei ole, siis leidub pigem harva, kuid siiski esinev probleemne olukord. Nimelt kui põhipildil orientatsiooni infot üldse ei ole, aga thumbnail-il on, siis väljastab exiftool thumbnail-i orientatsiooni nii, nagu see oleks põhipildi oma. Selle järgi edasisi otsuseid pildi töötlemiseks aga teha ei tohiks.

ImageMagick-u Identify abil saab orientatsiooni info kätte nii:

identify -format "%%[exif:*orientation*]" <faili nimi>

Tulemuseks on 0, 1 või 2 välja järgmistest:

Orientation=...
thumbnail:Orientation=...

Seejuures rea lõpus olev number on kas:

  • 1 - pilt on landscape-s ja ülemine pool ilusti üleval.
  • 8 - pilti tuleb kuvamisel 90 kraadi vastupäeva pöörata.
  • 6 - pilti tuleb kuvamisel 90 kraadi päripäeva pöörata.
  • 3 - pilti tuleb kuvamisel 180 kraadi pöörata.
  • Väärtuseid 2, 4, 5 ja 7 kasutatakse harva - nende puhul tuleb rääkida ka peegeldamistest.
  • Katsete tulemusena on nähtud ka väärtust 0, mis ei ole korrektne ning on sinna tekkinud ilmselt ebaõigest tarkvarast tulenevalt.

Kui on soov Identify tööriista väljund selliseks parsida, et seda saaks skriptis edasiste otsuste tegemiseks kasutada, võib abi olla järgmisest skripti lõigust:

ORIENT=$(identify -format "%[exif:*orientation*]" "$REPLY")
echo "$ORIENT" | grep "exif:Orientation" | awk -F "=" '{print $2}'
echo "$ORIENT" | grep "exif:thumbnail:Orientation" | awk -F "=" '{print $2}'

Neist esimene echo rida trükib välja täpselt ühe numbri, kui EXIF infos sisaldus põhipildi orientatsiooni info või tühja rea, kui seda ei sisaldunud. Teine echo rida teeb sama pisipildi orientatsiooni kohta.

Sarnase asja võiks trükkida välja järgmine skripti lõik:

exiftool -Orientation -S -s -n "$REPLY" | tr -d '[:space:]'

Siiski, nagu eespool öeldud, ei ole siit tulemusest võimalik kokkuvõttes järeldada, kas tegemist on põhi- või pisipildi orientatsiooniga.

Pildi pööramisega seotud probleemid

Probleemid võivad siinkohal tekkida järgmistest asjaoludest:

  • Kui pööramise info talletada EXIF-is, siis vanemad ja lihtsamad pildivaaturid seda kasutada ei oska. Seetõttu on osad pildid vaatamisel pööratuna.
  • Kui nüüd vanema pildivaaturiga pilt õigeks pöörata (mida näiteks vana ACDSee väga lihtsalt teha võimaldab), siis EXIF info ei tule kaasa ning seetõttu hakkavad uuemad pildivaaturid neid pilte valesti näitama.

Kõige universaalsem lahendus oleks see, kui fotoaparaat juba algselt pildi õiget pidi paneks - sellisel juhul näitaks pilti õigesti nii "teise maailmasõja aegne" tarkvara, "pesumasin" ja "käekell" kui ka uusimad "kosmosetehnoloogial põhinevad" pildivaaturid. Tegelikult ka põhjus, miks EXIF infona pildi orientatsiooni talletamine üldse teemaks tuli, ei ole ammu enam aktuaalne. Nimelt arvati toona, et pikslite kohe õiget pidi pööramine käib kaamera jms lihtsama riistvara jaoks üle jõu.

Kahjuks ei ole konkreetsete seadmete korral tihti valikut, mil viisil pildi pööramise info kaasa tuleb ning kui pilte koguda erinevatest allikatest, tuleb lihtsalt arvestada, et need on erinevad. Samuti võib juhtuda, et mõnda pilti on keegi juba varem keeranud ning pole teada, kas ära pöörati pikslid, EXIF info või mõlemad.

Alljärgnevad peatükid siis üritavadki pakkuda lahendusi erinevatele olukordadele, mis pildi pööramisega ette tulevad.

Automaatne orienteerimine

Kui on soov teha pildid selliseks, et neid oleks võimalik vaadata nii uuemate (EXIF toega) kui vanemate/lihtsamate pildivaaturitega, siis aitab ImageMagick paketti kuuluv Mogrify:

mogrify -auto-orient <faili nimi>

Kui pildis EXIF infot ei ole või seal on juba kirjas "Orientation=1", siis jääb pildi asend paika. Muul juhul keeratakse pildi pikslid vastavalt "Orientation=..." infole ja "nullitakse" EXIFis asend "Orientation=1" peale. Seega on pildid nüüd ilusti ja igal pool vaadatavad.

Tasub siiski veel mainimist, et:

  • Tasub mainida, et teoreetiliselt saab JPG failides 90- ja 180-kraadiseid pöördeid teha ka kadudeta. Samas selgus, et mogrify (nagu ka kõik muud ImageMagick paketti kuuluvad tööriistad) kodeerib JPG failid siiski ringi (ning seda isegi juhul kui algses failis oli "Orientation=1"), vähendades nende mahtu. Ilmselt see siiski eriliseks probleemiks ei ole - tänapäevased fotokad annavad enamasti välja rohkem piksleid kui ekraanile mahub ning ilmselt on ringi pakkimine siiski üsna väikse mõjuga. Alternatiivina sai proovitud ka jpegtran nimelist tööriista, mis peaks suutma JPG faile ilma ringi kodeerimata pöörata. Samas tulid ka sellega mingid veidrused välja:
    • Esiteks suudab ta täiesti probleemivabalt pöörata ainult pilte, mille suurus on 8 (või mingitel juhtudel 16) kordne arv piksleid mõlemas suunas. Aga see pole enamasti probleem.
    • Teiseks tegi ka see programm JPG failid väiksemaks. Ehk on tegemist hoopis mingi ballastiga, mille nii mogrify kui jpegtran eemaldasid?
    • Lõpuks tundub aga, et EXIF info üle kandmine ei ole jpegtran-i puhul päris lõpuni hea. Nimelt läks thumnail kaduma vaatamata -copy all valikule (mis peaks kõik EXIF info säilitama), samas mingid pointerid jäid ripakile, nii et edaspidi hakkab exiftool selle pildi peale hoiatusi pilduma.
  • Mogrify muudab ära faili viimati muudetud kuupäevad. Need saab soovi korral vastavalt EXIF infole taastada nii.
  • Kui pilt sisaldas ka thumbnail-i, siis seda Mogrify ei puutu, küll aga "nullitakse" ära ka "thumbnail:Orientation=1" parameeter. Kommentaar 2022: nüüd tundub, et thumbnail-i orientatsioon jääb pärast mogrify jooksutamist siiski paika. Thumbnail-i enda uuendamine on täiesti omaette teema.

Orientatsiooni info eemaldamine

Käesolev peatükk räägib EXIF infos oleva "Orientation=..." väärtuse "nullimisest" asendisse "Orientation=1". Vajalikuks võib see osutuda näiteks järgmistel juhtudel:

  • Tegemist on fotodega, mille keegi on varasemalt käsitsi vanema (st EXIF infot mitte toetava) pildivaaturiga õigeks keeranud. Tulemuseks on see, et vanemad ja lihtsamad pildivaaturid kuvavad pilti õigesti - pikslid said ju vastavalt ümber reastatud - aga kuna EXIF info jäi "nullimata", siis uuemad pildivaaturid keeravad kuvamisel pilti vastavalt EXIF infole veel edasi.
  • Tegemist on fotodega, kus EXIF info on muul põhjusel vale. Näiteks "põranda" või "lae" pildistamisel ei tea tegelikult aparaat, mis pidi kasutaja seda pilti soovib. Kui kasutaja on lähtunud eeldusest, et "taolisi pilte tehes hoian fotokat alati landscape asendis ja pilti tahan saada nii, et fotoka ülemine pool jääb pildil üles", siis võib selle pildipuu peal käesolevat käsku kasutada küll.
exiftool -Orientation=1 -n -overwrite_original <faili nimi>

Hoiatused:

  • Parameeter -overwrite_original ütleb, et algne fail kirjutatakse üle! Kui sa pole oma tegevuses kindel ning varukoopiat enne teinud ei ole (mida tegelikult alati tasub teha), siis võta see parameeter ära!
  • Kui kasutad seda käsku pildi peal, mis tegelikult pidi olema pööratud ja see pööramine tuli korrektselt EXIF infost välja, siis saad pildi, mida näitavad vales asendis nii vanemad kui uuemad pildivaaturid. Peale käesolevat operatsiooni võid samas pildi vanema pildivaaturiga käsitsi õigeks keerata ja siis hakkavad kõik pildivaaturid seda õigesti näitama :)

Lisaks tasub mainida, et:

  • Sarnaselt Mogrify-le muudab ka exiftool ära faili viimati muudetud kuupäevad. Need saab soovi korral vastavalt EXIF infole taastada nii.
  • Kui pilt sisaldas ka thumbnail-i, siis seda exiftool ei puutu, erinevalt Mogrify-st ei muudeta aga ka "thumbnail:Orientation=..." parameetrit. Thumbnail-i ja tema EXIF info uuendamine on täiesti omaette teema.
  • Erinevalt Mogrify-st kipub exiftool mudima kõiki faile, mis EXIF infot sisaldasid, st isegi neid, millel juba oli "Orientation=1".

Thumbnailid

Pilt võib sisaldada ka Thumbnail-i. Kui see on nii ja pilti on plaanis pöörata (või on seda eelnevalt juba tehtud), siis korrektne oleks ka Thumbnail õigesse asendisse pöörata. See teema vajab veel täiendavat uurimist, aga senised teadmised on järgmised:

  • exiftool oskab pildist Thumbnail-i välja võtta ning selle sinna ka (vahepeal muudetuna) tagasi panna, kuid ei oska Thumbnail-i ennast pöörata ega ka suurest pildist uut Thumbnail-i tekitada.
  • Vana Thumbnail-i pööramise või uue tekitamisega saab hakkama ImageMagick, kuid tema ei oska jälle vana Thumbnail-i pildist eraldada ega uut sinna lisada.

Seega on igal juhul vajalik mõlema tööriista järjestikune kasutamine. Kas nüüd Thumbnail-i pööramiseks on targem vana Thumbnail-i pöörata või suurest pildist uus luua, on valikute küsimus:

  • Vana pööramise eeliseks on see, et skriptina tehes ei pea mõtlema, mis need mõõtmed olema peaksid. Samas on raskem tuvastada, millist Thumbnail-i üldse on vaja pöörata, eriti kui pildid on pärit erinevatest kohtadest ja nende peal on eelnevalt erinevate tarkvaradega erinevaid operatsioone tehtud.
  • Uue loomise eeliseks on see, et uue võib luua alati, sõltumata sellest kas vana oli juba õiget pidi või mitte. Samas peab siis tegelema eraldi sellega, et ImageMagick soovitud uue Thumbnail-i mõõtmed ette saaks - algsed pildid on ju erineva resolutsiooni ja külgede suhtega.

Valiku koht on ka see, milliste piltide korral üldse tasub Thumbnail-i näppimist ette võtta:

  • Ilmselt vanade fotode korral, mis on a'la filmilt skaneeritud ja EXIF infot ei sisalda, pole mõtet.
  • Fotod, millel EXIF info on olemas, aga Thumbnail-i seni polnud. Jah või ei?
  • Fotod, millel Thumbnail oli olemas, võiks selle õigeks keerata küll. Või üldse eemaldada?

Seni on teada, et olemasoleva Thumbnail-i saab pildist kätte nii:

exiftool -b -ThumbnailImage "pildi nimi">"thumb_pildi_nimi"

See võimaldab siis ka manuaalselt vaadata, mis pidi need Thumbnail-id seal sees füüsiliselt on. NB! Vähemalt selle käsu korral exiftool-i ei huvita, mis väärtus "thumbnail:Orientation=..." algses failis kasutusel on. Loodud Thumbnail-i fail orientatsiooni infot ei sisalda ning pikslite paigutus on just selline, nagu ta algses failis on. Kui suurt pilti on vahepeal pööratud, siis Thumbnaili-i asend ei pruugi olla sama mis suurel pildil!

EXIF ajatempli nihutamine

Kui on teada, et fotoka kell oli vale ning on soov see EXIF infos õigeks liigutada, saab teha näiteks nii:

exiftool -v "-DateTimeOriginal-=0:0:0 1:10:0" *.jpg

See nihutab kõik kataloogis olevad JPG failid 1 tund ja 10 minutit tagasi.

NB! Solgib ära failide viimati muudetud kuupäevad! Need saab soovi korral tagasi nii, nagu kirjeldatud järgmises peatükis.

Failide viimati muudetud kuupäev

Mitmed ülal kirjeldatud operatsioonid muudavad ära failide viimati muudetud kuupäevad. On isikliku eelistuse küsimus, kas need peaksid kajastama pildi tegemise aega või mitte. Soovi korral saab peale operatsioonide teostamist viimati muudetud kuupäevad vastavalt EXIF infole taastada nii:

exiftool -v "-DateTimeOriginal>FileModifyDate" <faili nimi>

Ajatembeldamine

Mõnel juhul võib olla soov fotole mingit visuaalset automaatset infot peale kanda. Seda võimaldab teha näiteks FastStone Image Viewer. Kuskilt mujalt üles korjatud mõtteterad:

Basic steps to add dates to image files using Fast Stone Image Viewer:

Tools / Open Batch Convert / Batch Convert tab...
Check the box...Use advanced options...
Advanced Options button / Text tab /
Check the box...Add Text...

Open the drop window..."Insert a Variable"
choose...EXIF DateTime / Date and Time...OK...

Ürituse "Rannahooaeg algab märtsis 2012" fotod said ajatembeldatud järgmise eeskirja alusel:

($H4).($H3).($H2)  ($H5):($H6)
Font: Verdana, 48, Bold
XY Offset: -25, -25

Katsed Tipikate Rattamatkaklubi fotoarhiiviga

Sissejuhatus

Katsete ja pilditöötluse eesmärgiks novembris 2017 oli see, et Tipikate Rattamatkaklubi fotoarhiiv selles mõttes korrektseks teha, et see oleks vaadatav nii vanemate kui uuemate pildivaaturitega. Kuna aga ajaloo jooksul on pilte tulnud väga erinevatest allikatest ning nende peal on juba eelnevalt töötlust tehtud, siis ühe ja lihtsa skriptiga peale lennata ei saa. Selle asemel tuleb teha otsuseid, et mida ja millistes failides tasub näppida ja mida mitte. Pilte on selles arhiivis 13011.

Selleks, et andmeid koguda ja vajalikke otsuseid teha, sai tehtud skript, mis skaneerib kogu kataloogipuu läbi ning lisab iga pildi kohta ühe rea tekstifaili:

<Faili nimi> <Suurus> <MD5> <Viimati muudetud> <EXIF DateTimeOriginal> <Pixels X> <Pixels Y> <Thumbnail X> <Thumbnail Y> <Orientation> <thumbnail:Orientation>

Seejärel on võimalik fotode peal erinevaid skripte katsetada ja hiljem näiteks Excelis andmetöötlust teha, et mis muutus, mis mitte ja kas see oli mõistlik.

Skript näeb välja nii:

while IFS= read -r -d '' -u 9
do
# Print out the file name, size and MD5 sum:
    printf "%s\t%s\t" "$REPLY" $(stat -c '%s' "$REPLY")
    md5=($(md5sum "$REPLY"))
    printf "%s\t" $md5

# Print out the file modified time
    printf "%s\t" $(stat -c '%Y' "$REPLY")

# Print out the EXIF DateTimeOriginal
    printf "%s\t" "$(exiftool -d "%s" -DateTimeOriginal -S -s "$REPLY")"

# Print out the image size in pixels:
    identify -format "%w\n%h\n" "$REPLY" | tr "\n" "\t"

# Print out thumbnail dimensions if it exists:
    thumbfile="_temp_thumb.jpg"
    exiftool -b -ThumbnailImage "$REPLY" > "$thumbfile"
    if [ -s "$thumbfile" ]
    then
        identify -format "%w\n%h\n" "$thumbfile" | tr "\n" "\t"
    else
        printf "\t\t"
    fi

    rm -f "$thumbfile"

# Print out orientation information
    ORIENT=$(identify -format "%[exif:*orientation*]" "$REPLY")
    printf "%s\t" $(echo "$ORIENT" | grep "exif:Orientation" | awk -F "=" '{print $2}')
    printf "%s\t" $(echo "$ORIENT" | grep "exif:thumbnail:Orientation" | awk -F "=" '{print $2}')
    printf "\n"
done 9< <( find . -type f -iname "*.jpg" -print0 )

Teisendus 24.11.2017

Sai loodud kataloog fotoarhiiv3, milles:

  • Sai muudetud ainult faile, kus "Orientation=..." info on olemas ja väärtus erinev 1-st. Nendes sai seatud siis "Orientation=1".
  • Muudetud failide viimati muudetud kuupäevad said taastatud puhtalt selle baasilt, mis seal enne kirjas oli.
  • Thumbnail-e ega thumnail:Orientation=... välju ei muudetud.

Skript, mis selle ära tegi:

PROCESSED_LIST="processed.txt"

./printphotoinfo > phinfo_before.txt
rm -f "$PROCESSED_LIST"

while IFS= read -r -d '' -u 9
do
# Get the Orientation value and remove the whitespaces
    ORIENT=$(identify -format "%[exif:*orientation*]" "$REPLY" | grep "exif:Orientation" | awk -F "=" '{print $2}' | tr -d '[:space:]')

# Process only files where Orientation value exists, is numberic, but not
# equal to 1.
    re='^[0-9]+$'
    if [[ $ORIENT =~ $re ]] && [[ $ORIENT != 1 ]]
    then
        echo "$REPLY" >> "$PROCESSED_LIST"
# Save last modified time
        MODIF_TIME="$(date -R -r "$REPLY")"
        exiftool -Orientation=1 -n -overwrite_original "$REPLY"

# Restore last modified time
        touch -d "$MODIF_TIME" "$REPLY"
    fi

done 9< <( find . -type f -iname "*.jpg" -print0 )

./printphotoinfo > phinfo_after.txt

Tasub mainida, et ./printphotoinfo skript, mida ülal kahel korral kutsutakse, on siis eespool kirjeldatud skript, mis koostab tekstiformaadis fotobaasi info enne ja pärast muudatusi.

Teisendus 17.11.2018

17.11.2018 sai liigutatud aasta tagasi tehtud kataloog "fotoarhiiv3" pealiini (ehk asukohta, kus teda kasutatakse peamise kataloogina piltide vaatamisel). Originaalfailid läksid "other" kausta alla. Nimetatud pealiin ei ole küll veel päris lõplik tõde, aga kuni seda veel ei ole, on ta igal juhul hetkel parim saadaolev versioon. Eelkõige lahutavad meid lõplikust tõest veel Thumbnail-ide töötlemine ja EXIF infos ning faili viimati muudetud kuupäevas oleva info võrdlemine/kontroll.

Kuna 2018. aasta piltide puhul on eelduseks, et EXIF infos olevat pööramise infot tuleb austada, siis lisame 2018. aasta fotod pealiini skripti abil, mis pildid pikslite mõttes õigeks keerab ning seejärel EXIF infot oleva Orientation välja väärtusele "1" seab. Kui EXIF infot ei ole või väärtus on juba "1", siis faili ei näpi. Failide viimati muudetud kuupäevad jätame endiseks, EXIF infoga ei võrdle.

Skript, mis asja ära teeb:

PROCESSED_LIST="processed.txt"

./printphotoinfo > phinfo_before.txt
rm -f "$PROCESSED_LIST"

while IFS= read -r -d '' -u 9
do
# Get the Orientation value and remove the whitespaces
    ORIENT=$(identify -format "%[exif:*orientation*]" "$REPLY" | grep "exif:Orientation" | awk -F "=" '{print $2}' | tr -d '[:space:]')

# Process only files where Orientation value exists, is numberic, but not
# equal to 1.
    re='^[0-9]+$'
    if [[ $ORIENT =~ $re ]] && [[ $ORIENT != 1 ]]
    then
        echo "$REPLY" >> "$PROCESSED_LIST"
# Save last modified time
        MODIF_TIME="$(date -R -r "$REPLY")"
        mogrify -auto-orient "$REPLY"

# Restore last modified time
        touch -d "$MODIF_TIME" "$REPLY"
    fi

done 9< <( find . -type f -iname "*.jpg" -print0 )

./printphotoinfo > phinfo_after.txt

Tasub mainida, et kuigi Mogrify iseenesest ei puutu faile, milles Orientation infot ei ole või kus selle väärtuseks on juba "1", siis kasutame ka siin ikkagi manuaalset eelkontrolli, nagu aasta tagasi ExifTool-i kasutavas skriptis. Selle tulemusena ei ürita me taastada viimati muudetud kuupäeva nendel failidel, mida muuta pole vaja. Samuti on sel juhul kindel, et otsus, kas faili üldse muuta tuleb, on läbi ajaloo täpselt sama, st et pole mingeid veidrusi sõltuvalt sellest, kas otsuse teeb ExifTool või Mogrify.

Tegemist/uurimist vajavad sammud

  • Thumbnailid (eemaldada või taasluua).
  • Võrrelda EXIF kuupäevi faili viimati muudetud kuupäevadega.
  • Kontroll.

Operatsiooni mass-teostamine

Terve kataloogipuu peal

Sissejuhatus

Kui on soov teostada operatsioon kõigi kataloogis olevate failide peal (või kitsamalt pigem kõigi JPG failide peal), siis on kõige lihtsam kasutada käesolevas peatükis toodud skripti.

Windowsis

Üks võimalik versioon Windowsi BAT failist, mis skaneerib rekursiivselt läbi terve kataloogipuu, alates tema enda paiknemisest, oleks järgmine:

@echo off
call :treeProcess
goto :eof

:treeProcess

for %%f in (*.jpg) do (
    rem Do whatever you want here over the files of this subdir, for example:
    echo %%f
    c:\programs\exiftool\exiftool -v "-DateTimeOriginal>FileModifyDate" "%%f"
)

for /D %%d in (*) do (
    cd %%d
    call :treeProcess
    cd ..
)
exit /b

Kui skripti jooksutatakse suuremate kataloogipuude peal, siis tasub siia kindlasti ka mingi progressi indikaator implementeerida.

Linuxis

Selleks, et ei tekiks probleeme tühikute ja mingite imemärkidega failinimedes, peab tsükli tegemisel mõned asjad arvesse võtma. Mingit arutelu sel teemal võib lugeda siit. Tsükkel näeb välja nii:

while IFS= read -r -d '' -u 9
do
    # Just print out all the file names
    echo "$REPLY"
done 9< <( find . -type f -iname "*.jpg" -print0 )

Peamine loogika selle tsükli taga on see, et find otsib alates käesolevast kataloogist kõik JPG failid üles ja saadab need "torusse number 9", kuskuures "-print0" teeb seda, et iga faili lõpus on terminaatoriks 0.

read loeb aga nimed torust välja, kusjuures ei tunnista ühtegi muud eraldajat peale 0-terminaatori. Tulemus ehk faili nimi antakse muutujas $REPLY.

Etteantud nimekirja peal

Sissejuhatus

Etteantud nimekirja peal operatsiooni teostamine võib olla vajalik näiteks juhtudel, kui eelnevalt on koostatud nimekiri näiteks failidest, mis üldse sisaldavad Thumbnail-e ja/või EXIF infot ning on soov operatsioon ainult nende peal läbi viia.

Windowsis

Allpool olev BAT fail loeb failist nimekiri.txt töötlemist vajavate failide nimekirja ning teostab igaühega nõutud operatsiooni. Nimekirjas peaks olema üks faili nimi igal real, vajadusel täispika path-ina.

@echo off

for /F "tokens=*" %%A in (nimekiri.txt) do (
    if exist "%%A" (
        rem file exists
    ) else (
        rem print out file names that do not exist in the filesystem
        echo %%A
    )
)