Markierte Bilder drucken

Das erste Beispiel zeigte uns die Grundlagen von Lua und erlaubte uns zu überprüfen, ob alles richtig funktioniert. Lass uns nun etwas Komplizierteres machen. Versuchen wir, eine Liste der Bilder auszudrucken, die mit einem roten Etikett versehen sind. Aber zunächst einmal, was ist ein Bild?

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

Das Ausführen des obigen Codes erzeugt eine Menge Output. Wir werden es uns gleich anschauen, aber zuerst schauen wir uns den Code selbst an.

Wir wissen, über require darktable. Hier benötigen wir separat require darktable.debug, was ein optionaler Abschnitt der API ist, der Hilfsfunktionen zur Verfügung stellt, um Lua-Skripte zu debuggen.

darktable.database ist eine von der API bereitgestellte Tabelle, die alle Bilder in der Datenbank enthält. Jeder Eintrag in der Datenbank ist ein Bildobjekt. Bildobjekte sind komplexe Objekte, die es Ihnen ermöglichen, Ihr Bild auf verschiedene Weise zu manipulieren (im Abschnitt types_dt_lua_image_t des API-Handbuchs dokumentiert). Um unsere Bilder anzuzeigen, verwenden wir darktable.debug.dump, eine Funktion, die alles als Parameter nimmt und den Inhalt rekursiv ausgibt. Da es sich bei Bildern um komplexe Objekte handelt, die indirekt auf andere komplexe Objekte verweisen, ist das Ergebnis enorm. Unten sehen Sie ein Beispiel für die Ausgabe.

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

Wie wir sehen können, hat ein Bild eine große Anzahl von Feldern, welche alle möglichen Informationen darüber liefern. Wir interessieren uns für das rote Etikett. Dieses Feld ist ein boolesches Feld, und die Dokumentation sagt uns, dass es geschrieben werden kann. Jetzt müssen wir nur noch alle Bilder mit diesem Feld finden und ausdrucken.:

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

Dieser Code sollte an dieser Stelle recht einfach zu verstehen sein, aber er enthält ein paar interessante Aspekte über Lua, die es wert sind, hervorgehoben zu werden:

  • ipairs ist eine Standard-Lua-Funktion, die durch alle numerischen Indizes einer Tabelle iteriert. Wir benutzen es hier, weil die Datenbank von darktable nicht-numerische Indizes hat, die Funktionen sind, um die Datenbank selbst zu manipulieren (z. B. Bilder hinzufügen oder löschen).

  • Das Iterieren durch eine Tabelle gibt sowohl den Schlüssel als auch den verwendeten Wert zurück. Es ist in Lua üblich, eine Variable mit dem Namen “_” zu verwenden, um Werte zu speichern, die uns egal sind.

  • Beachte, dass wir hier die Standard-Lua-Funktion tostring verwenden und nicht die darktable-spezifische darktable.debug.dump. Die Standardfunktion gibt einen Namen für das Objekt, während die Debug-Funktion den Inhalt druckt. die Debug-Funktion würde hier zu weitschweifig sein, um sie hier zu zeigen. Nochmals, es ist ein großartiges Debug -Werkzeug und sollte nicht anderweitig genutzt werden.

Translations