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?
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 Ansel
. Hier benötigen wir separat require Ansel.debug
, was ein optionaler Abschnitt der API ist, der Hilfsfunktionen zur Verfügung stellt, um Lua-Skripte zu debuggen.
Ansel.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 Ansel.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.
1toplevel (userdata,dt_lua_image_t) : /images/100.JPG
2 publisher (string) : ""
3 path (string) : "/images"
4 move (function)
5 exif_aperture (number) : 2.7999999523163
6 rights (string) : ""
7 make_group_leader (function)
8 exif_crop (number) : 0
9 duplicate_index (number) : 0
10 is_raw (boolean) : false
11 exif_iso (number) : 200
12 is_ldr (boolean) : true
13 rating (number) : 1
14 description (string) : ""
15 red (boolean) : false
16 get_tags (function)
17 duplicate (function)
18 creator (string) : ""
19 latitude (nil)
20 blue (boolean) : false
21 exif_datetime_taken (string) : "2014:04:27 14:10:27"
22 exif_maker (string) : "Panasonic"
23 drop_cache (function)
24 title (string) : ""
25 reset (function)
26 create_style (function)
27 apply_style (function)
28 film (userdata,dt_lua_film_t) : /images
29 1 (userdata,dt_lua_image_t): .toplevel
30 [......]
31 exif_exposure (number) : 0.0062500000931323
32 exif_lens (string) : ""
33 detach_tag (function): toplevel.film.2.detach_tag
34 exif_focal_length (number) : 4.5
35 get_group_members (function): toplevel.film.2.get_group_members
36 id (number) : 1
37 group_with (function): toplevel.film.2.group_with
38 delete (function): toplevel.film.2.delete
39 purple (boolean) : false
40 is_hdr (boolean) : false
41 exif_model (string) : "DMC-FZ200"
42 green (boolean) : false
43 yellow (boolean) : false
44 longitude (nil)
45 filename (string) : "100.JPG"
46 width (number) : 945
47 attach_tag (function): toplevel.film.2.attach_tag
48 exif_focus_distance (number) : 0
49 height (number) : 648
50 local_copy (boolean) : false
51 copy (function): toplevel.film.2.copy
52 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.:
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
is a standard lua function that will iterate through all numeric indices of a table. We use it here because Ansel’s database has non-numeric indices which are functions to manipulate the database itself (adding or deleting images, for example).Iterating through a table will return both the key and the value used. It is conventional in lua to use a variable named “
_
” to store values that we don’t care about.Note that we use the standard lua function
tostring
here and not the Ansel-specificAnsel.debug.dump
. The standard function will return a name for the object whereas the debug function will print the content. The debug function would be too verbose here. Once again, it is a great debug tool but it should not be used for anything else.