Impression d’images étiquetées
Le premier exemple nous a montré les bases mêmes de Lua et nous a permis de vérifier que tout fonctionnait correctement. Faisons maintenant quelque chose d’un peu plus complexe. Essayons d’imprimer la liste des images auxquelles est attachée l’étiquette “rouge”. Mais avant tout, qu’est-ce qu’une image ?
local darktable = require "darktable"
local debug = require "darktable.debug"
print(darktable.debug.dump(darktable.database[1]))
L’exécution du code ci-dessus produit beaucoup de données. Nous l’examinerons dans un instant, mais regardons d’abord le code lui-même.
Nous connaissons require darktable. Ici, nous devons ajouter require darktable.debug qui est une section facultative de l’API qui fournit des fonctions d’assistance pour aider à déboguer les scripts Lua.
darktable.database est une table fournie par l’API qui contient toutes les images de la base de données de la bibliothèque. Chaque entrée de la base de données est un objet image. Les objets image sont des objets complexes qui vous permettent de manipuler votre image de différentes manières (toutes documentées dans la section types_dt_lua_image_t du manuel de l’API). Pour afficher nos images, nous utilisons darktable.debug.dump qui est une fonction qui accepte n’importe quel paramètre et en imprime le contenu. Étant donné que les images sont des objets complexes qui font indirectement référence à d’autres objets complexes, la sortie est énorme. Vous trouverez ci-dessous un exemple réduit de la sortie.
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
Comme on peut le voir, une image a un grand nombre de champs qui fournissent toutes sortes d’informations à son sujet. Ici, on s’intéresse au label “rouge (red)”. Ce champ est un booléen, et la documentation nous dit qu’il peut être écrit. Il ne nous reste plus qu’à trouver toutes les images avec ce champ et les imprimer :
darktable = require "darktable"
for _,v in ipairs(darktable.database) do
if v.red then
print(tostring(v))
end
end
Ce code devrait être assez simple à comprendre à ce stade, mais il contient des aspects intéressants de Lua qui méritent d’être soulignés :
-
ipairs est une fonction Lua standard qui parcourt tous les indices numériques d’une table. Nous l’utilisons ici car la base de données de darktable a des indices non numériques qui sont des fonctions permettant de manipuler la base de données elle-même (ajout ou suppression d’images, par exemple).
-
L’itération dans une table renvoie à la fois la clé et la valeur. Il est conventionnel dans Lua d’utiliser une variable nommée “_” pour stocker des valeurs dont nous ne nous soucions pas.
-
Notez que nous utilisons ici la fonction Lua standard tostring et non la fonction darktable.debug.dump spécifique à darktable. La fonction standard renvoie un nom pour l’objet tandis que la fonction de débogage imprimera le contenu. La fonction de débogage serait trop prolixe ici. Encore une fois, c’est un excellent outil de débogage mais il ne doit pas être utilisé pour autre chose.