stampare immagini etichettate

Il primo esempio ci ha mostrato i rudimenti di lua e ci ha permesso di verificare che tutto funzionasse. Facciamo adesso qualcosa di leggermente più complesso. Proviamo a stampare una lista di immagini che hanno allegata un’etichetta “rossa”. Ma, innanzitutto, cos’è un’immagine?

local darktable = require "darktable"
local debug = require "darktable.debug"
print(darktable.debug.dump(darktable.database[1]))

Lanciare il codice qui sopra produrrà un sacco di output. Ci guarderemo fra un attimo, ma prima guardiamo al codice stesso.

Sappiamo già riguardo a require darktable. Qui abbiamo bisogno di richiamare separatamente require darktable.debug che è un’importante sezione delle API che fornisce funzioni d’aiuto a debuggare gli script lua.

darktable.database è una tabella fornita dalle API che contiene tutte le immagini nella libreria. Ciascun elemento nel database è un oggetto immagine. Gli oggetti Image sono oggetti complessi che ti permettono di manipolare la tua immagine in varie maniera (tutte documentate nella sezione types_dt_lua_image_t del manuale API). Per mostrare le tue immagini, usiamo darktable.debug.dump che è una funzione che prende qualsiasi cosa come suo parametro e ricorsivamente fa il dump del suo contenuto. Siccome le immagini sono oggetti complessi che indirettamente referenziano altri oggetti complessi, l’output risultante è massivo. Qui sotto un estratto di esempio dell’output.

toplevel (userdata,dt_lua_image_t) : /images/100.JPG
   publisher (string) : ""
   path (string) : "/images"
   move (function)
   exif_aperture (number) : 2.7999999523163
   rights (string) : ""
   make_group_leader (function)
   exif_crop (number) : 0
   duplicate_index (number) : 0
   is_raw (boolean) : false
   exif_iso (number) : 200
   is_ldr (boolean) : true
   rating (number) : 1
   description (string) : ""
   red (boolean) : false
   get_tags (function)
   duplicate (function)
   creator (string) : ""
   latitude (nil)
   blue (boolean) : false
   exif_datetime_taken (string) : "2014:04:27 14:10:27"
   exif_maker (string) : "Panasonic"
   drop_cache (function)
   title (string) : ""
   reset (function)
   create_style (function)
   apply_style (function)
   film (userdata,dt_lua_film_t) : /images
      1 (userdata,dt_lua_image_t): .toplevel
      [......]
   exif_exposure (number) : 0.0062500000931323
   exif_lens (string) : ""
   detach_tag (function): toplevel.film.2.detach_tag
   exif_focal_length (number) : 4.5
   get_group_members (function): toplevel.film.2.get_group_members
   id (number) : 1
   group_with (function): toplevel.film.2.group_with
   delete (function): toplevel.film.2.delete
   purple (boolean) : false
   is_hdr (boolean) : false
   exif_model (string) : "DMC-FZ200"
   green (boolean) : false
   yellow (boolean) : false
   longitude (nil)
   filename (string) : "100.JPG"
   width (number) : 945
   attach_tag (function): toplevel.film.2.attach_tag
   exif_focus_distance (number) : 0
   height (number) : 648
   local_copy (boolean) : false
   copy (function): toplevel.film.2.copy
   group_leader (userdata,dt_lua_image_t): .toplevel

Come possiamo vedere, un’immagine ha un gran numero di campi che forniscono qualsiasi sorta di informazione sull’immagine. Qui siamo interessati all’etichetta “rosso”. Questo campo è un booleano, e la documentazione ci dice che può essere scritto. Ora abbiamo solo bisogno di trovare tutte le immagini con quel campo e di stamparle:

darktable = require "darktable"
for _,v in ipairs(darktable.database) do
  if v.red then
    print(tostring(v))
  end
end

Questo codice dovrebbe essere abbastanza semplice da capire a questo punto, ma contiene alcuni aspetti interessanti di lua che valgono la pena di essere evidenziati:

  • ipairs è una funzione standard lua che itera attraverso tutti gli indici numerici di una tabella. La usiamo qui perché il database di darktable ha indici non numerici che sono funzioni per manipolare il database stesso (aggiungendo o rimuovendo immagini, per esempio).

  • Iterare attraverso una tabella restituirà sia la chiave che il valore usato. E’ convenzione in lua di usare una variable nominata “_” per contenere valori che non ci interessano.

  • Notare che qui usiamo la funzione lua standard tostring, e non quella specifica di darktable darktable.debug.dump. La funzione standard restituirà il nome per un oggetto mentre la funzione di debug stamperà il suo contenuto. La funzione di debug potrebbe essere prolissa qui. Ancora una volta, è un ottimo strumento di debug ma non dovrebbe essere usato per nient’altro.

translations