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.

translations