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-spezifischedarktable.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.