Spracovanie digitálnej fotografie v Linuxe

Keď som si približne v roku 2004 zaobstaral prvý digitálny fotoaparát, začal som sa zaoberať trošku aj spracovaním digitálnej fotografie pod Linuxom.

Najpr som hľadal prezerač obrázkov. Ten som našiel pomerne rýchlo a dlhý čas som teda používal prehliadač gqview. Ten bol svojho času jeden z najlepších. Ale prednedávnom došlo k nahradeniu prehliadača gqview jeho forkom s podobným názvom geeqie, kedže podľa všetkého sa pôvodný autor prestal vývoju venovať.

Vylepšenia geeqie sú super, aj keď znamenali miernu nekompatibilitu so staršou gqview verziou. Ale je to daň za pokrok a na geeqie sa dá veľmi ľahko zvyknúť.

Jedným z úkonov je stiahnutie fotiek z fotoaparáta do určeného adresára.
Okrem skopírovania som požadoval napr. aj automatické otočenie fotografie ak som fotil zvislo, premenovanie podľa času a dátumu a pod.
Robiť tieto veci manuálne je dosť otrava, preto ako správny Linuxák som hľadal spôsob, ako túto vec čo najviac automatizovať.

Na jednotlivé úkony sú dostupné jednoúčelové utilitky, ktoré ale je možné výborne kombinovať. Preto mám u seba nainštalovaný tento základ (Debian balíky):

apt-get install exiv2 jhead imagemagick dcraw netpbm geeqie

Použitie je jednoduché, napr.:

jhead '-n%Y-%m-%d_%H%M%S_%f' IMG*.JPG

príkaz uvedený vyššie zmení názov fotiek na názvy podľa dátumu a času zhotovenia súboru. Použije pri tom Exif informácie z JPEG obŕazku.

Ďalší príkaz skonvertuje obrázok vo formáte RAW na JPEG:

dcraw -w IMG_9876.CR2
ppmtojpeg IMG_9876.ppm > IMG_9876.JPG && rm -f IMG_9876.ppm

Prevádzať takýmto štýlom nafotené zábery na JPEG obrázky by však bolo dosť prácne a nepohodlné.

Odhodlal som sa teda túto úlohu automatizovať a výsledkom je skript na kopírovanie fotiek, ktorý by mal fungovať pre väčšinu dostupných digitálnych fotoaparátov. Konkrétne ho mám odskúšaný pre 2 typy kompaktov a 2 zrkadlovky (Canon EOS 300D a 350D).

Naprogramovať takýto skript bola zábava. Písal a testoval som ho veľmi opatrne, pretože akákoľvek chyba by mohla znamenať stratu drahocenných záberov. Žial, narazil som aj na zopár zvláštností najmä pri staršom fotoaparáte Canon EOS 300D. Podľa mňa to boli jednoznačne chyby v generovaných súboroch, ale tie už našťastie boli vo vyššej verzii Canonu EOS 350D opravené. Každopádne mám Canon EOS 300D funkčný dodnes (do času písania tohto príspevku 😉 ), takže aj podpora na opravu týchto nezrovnalostí v mojom skripte stále existuje.

Čo môj skript na kopírovanie fotiek dokáže? Veľmi jednoduchú vec: skopíruje zábery z pamäťovej karty do adresára, zábery automaticky pootáča a skonvertuje RAW súbory na JPEG. Pod kapotou sa však deje zhruba toto:

  • pripojenie USB zariadenia (automount nepoužívam)
  • skopírovanie fotiek do adresára (štandardne $HOME/media/foto/<aktualny_rok>)
  • bezstratová automatická rotácia JPEG záberov
  • oprava a doplnenie Exif informácií do skonvertovaného JPEG, ak je RAW fotka vytvorená s Canon EOS 300D
  • premenovanie JPEG a RAW súborov podľa dátumu a času zhotovenia záberu

Za najväčšiu výhodu tohto skriptu aj tak považujem to, že je možné tento skript spustiť kliknutím na ikonku napr. v IceWM (kde bežný uživateľ nevie ikonku nijako odstrániť) a premenovanie a autorotácia fotiek sa udeje automaticky sama. Ak to takto nastavíte menej skúsenému užívateľovi (napr. mame 🙂 ), tak si ušetríte kopec práce s vysvetľovaním, že najprv treba niečo niekde pripojiť, potom takto skopírovať, premenovať, bla bla bla … a nakoniec odpojiť. Ale odpojiť až nakoniec. No čert aby sa v tom vyznal.

Nabudúce možno ešte napíšem o tom, ako svoje fotografie zálohovať a prípadne ako z nich vyrobiť galériu na webe. Ale to až nabudúce.

Ak Vás teda tento nástroj oslovil prípadne máte nejaké návrhy, ako by sa dal vylepšiť, tak mi prosím napíšte.

0 názorov na “Spracovanie digitálnej fotografie v Linuxe

  1. Mikulas

    Hm. Skusal som ten skript a mne to neotaca. Mylsim, ze mi nejak fotak a ani telefon nezapisuju spravne do exifu udaje

    Orientation : Horizontal (normal)

    Chybu vyhadzuje:
    Error : No such file
    in file ‚img_*.jpg‘
    IMG_*.JPG: Failed to open the file
    Exiv2 exception in print action for file IMG_*.JPG:
    IMG_*.JPG: Failed to open the data source: Adresár alebo súbor neexistuje (errno = 2)
    IMG_*.JPG: Orientation: UNKNOWN

    🙁

    1. Ľubomír Host

      Ahoj,
      posli mi zopar fotiek z fotaku prip. telefonu (subory skopiruj manualne bez pouzitia skriptu), pozriem ze co sa s tym da spravit. Aky typ fotoaparatu mas? Priklady fotiek nafot vo vodorovnej a zvislej polohe.

      Niektore chyby suvisia s expanziou hviezdicky v shelli. Pozriem aj to, ci sa s tym neda nieco spravit.

      1. Mikulas

        Poslal som Ti to na mail, teda aspon dufam, lebo tu som nenasiel moznost prilozit subor.

        Zatial dik.

        1. Ľubomír Host

          Tvoja Minolta DiMAGE Z2 asi nezapisuje exif tag Exiv.Image.Orientation spravne, hoci tam nieco dava. Vid

          for i in *.JPG ; do echo — $i; exiv2 -p v $i | grep Orientation ; done

  2. Mikulas

    No Ty ma vobec nemas rad. 🙂 Zo straty fotiek mam strach a teraz mi ponukas dokaz ze som ich stratil. Hehe.
    Vyzera to zaujimavo ale akosik mi nie je celkom jasne ako to ma fungovat. Nakopiroval som to do textaku ulozil spravil som ho sputitelnym spustil som ho a
    vyhodilo toto :
    — Processing year 2004
    — Processing year 2005
    — Processing year 2006
    — Processing year 2007
    — Processing year 2008
    — Processing year 2009
    — Processing year 2010
    — Processing year 2011
    ..
    TAk som skusil upravit cestu v skripte k fotkam a to iste.
    Ako sa to ma spustat?

  3. Mikulas

    Ahoj.
    No isiel som podla postupu teda az na
    MEDIA=“$HOME/media“
    DIRS=“foto video“ # subdirs of $MEDIA for verification
    toto som zmenil na
    MEDIA=“$HOME/Obrázky“
    #DIRS=“foto video“ # subdirs of $MEDIA for verification
    a vysledok furt rovnaky nevytvori sa $YEAR-hashdeep-checksum.csv a ani $YEAR-cfv-checksum.csv

    Nieco robim asi zle.
    Subory som mal len na citanie a uz som povolil aj zapis mazanie ale nejak to nejde.

    1. Ľubomír Host

      Problem je v tom, ze mas premennu DIRS prazdnu. Moje fotky mam u seba o uroven nizsie.

      Skus nastavit takto:
      MEDIA=“$HOME/Obrázky“
      DIRS=“.“

  4. Mikulas

    Ano toto zabralo.
    DIRS=“.“

    Ale este jedna malickost -> $YEAR-cfv-checksum.csv tento subor je prazdny.

    cele to prebiehalo asi takto pri kazdom roku
    — Processing year 2011
    2011 : Is a directory
    /home/bum/Obrázky//./2011-cfv-checksum.csv: 1 files, 0 OK, 1 file errors. 0.001 seconds, 0.0K/s

    1. Ľubomír Host

      Ufff, teraz sa uz nechytam. Ale mas v adresari Obrazky este podadresare podla rokov? Az nie, tak si budes musiet skript asi trosku upravit.

  5. Mikulas

    Takze som trochu skusal a dosiel so na to ze cfv sa asi nevie vnorit do podadresara teda do 20..
    Ano strukturu mam Obrázky/20..
    ked som pustil v adresari Obrázky/ len cfv -C -tcsv
    vybaflo na mna to iste teda prazdny subor ak vobec nejaky. Ked som sa vosiel do adresara Obrázky/2004 spravil subor ako mal.
    Podla mna je chyba tu /home/bum/Obrázky*//*./