gelabelde afbeeldingen afdrukken

Het eerste voorbeeld liet ons de basis van lua zien en stelde ons in staat om te controleren of alles goed werkte. Laten we nu iets ingewikkelders doen. Laten we proberen een lijst met afbeeldingen af te drukken waaraan een “rood” label is bevestigd. Maar allereerst, wat is een beeld?

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

Het uitvoeren van de bovenstaande code zal veel output produceren. We zullen er zo naar kijken, maar laten we eerst naar de code zelf kijken.

We weten over require darktable. Hier moeten we afzonderlijk `darktable.debug’ vereisen, wat een optioneel gedeelte van de API is dat hulpfuncties biedt om lua-scripts te debuggen.

darktable.database is een tabel die wordt geleverd door de API en die alle afbeeldingen in de bibliotheekdatabase bevat. Elk item in de database is een afbeeldingsobject. Afbeeldingsobjecten zijn complexe objecten waarmee je jouw afbeelding op verschillende manieren kan manipuleren (allemaal gedocumenteerd in de sectie types_dt_lua_image_t van de API-handleiding). Om onze afbeeldingen weer te geven, gebruiken we darktable.debug.dump, een functie die alles als parameter neemt en de inhoud recursief dumpt. Omdat afbeeldingen complexe objecten zijn die indirect verwijzen naar andere complexe objecten, is de resulterende output enorm. Hieronder is een verkleind voorbeeld van de 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

Zoals we kunnen zien, heeft een afbeelding een groot aantal velden die er allerlei informatie over geven. Hier zijn we geïnteresseerd in het “rode” label. Dit veld is een boolean en de documentatie vertelt ons dat het kan worden geschreven. We hoeven nu alleen nog maar alle afbeeldingen met dat veld te vinden en ze uit te printen:

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

Deze code zou op dit moment vrij eenvoudig te begrijpen moeten zijn, maar het bevat een paar interessante aspecten van lua die de moeite waard zijn om te benadrukken:

  • ipairs is een standaard lua-functie die door alle numerieke indices van een tabel zal itereren. We gebruiken het hier omdat de database van darktable niet-numerieke indices heeft die functies zijn om de database zelf te manipuleren (bijvoorbeeld door afbeeldingen toe te voegen of te verwijderen).

  • Door een tabel te doorlopen, wordt zowel de sleutel als de gebruikte waarde geretourneerd. Het is gebruikelijk in lua om een variabele met de naam “_” te gebruiken om waarden op te slaan die ons niet interesseren.

  • Merk op dat we hier de standaard lua-functie tostring gebruiken en niet de darktable-specifieke darktable.debug.dump. De standaardfunctie retourneert een naam voor het object, terwijl de foutopsporingsfunctie de inhoud afdrukt. De debug-functie zou hier te uitgebreid zijn. Nogmaals, het is een geweldig hulpmiddel voor foutopsporing, maar het mag niet voor iets anders worden gebruikt.

translations