impresión de imágenes etiquetadas

El primer ejemplo nos mostró los conceptos básicos de lua y nos permitió comprobar que todo funcionaba correctamente. Ahora hagamos algo un poco más complejo. Intentemos imprimir una lista de imágenes que tengan una etiqueta “roja” adjunta. Pero antes que nada, ¿qué es una imagen?

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

Ejecutar el código anterior producirá una gran cantidad de resultados. Lo veremos en un momento, pero primero veamos el código en sí.

Sabemos acerca de require darktable. Aquí, necesitamos requerir darktable.debug por separado, que es una sección opcional de la API que proporciona funciones auxiliares para ayudar a depurar scripts lua.

darktable.database es una tabla proporcionada por la API que contiene todas las imágenes en la base de datos de la biblioteca. Cada entrada en la base de datos es un objeto de imagen. Los objetos de imagen son objetos complejos que le permiten manipular su imagen de varias formas (todo documentado en la sección types_dt_lua_image_t del manual de la API). Para mostrar nuestras imágenes, usamos darktable.debug.dump que es una función que tomará cualquier cosa como parámetro y volcará recursivamente su contenido. Dado que las imágenes son objetos complejos que indirectamente hacen referencia a otros objetos complejos, la salida resultante es enorme. A continuación se muestra un ejemplo reducido de la salida.

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

Como podemos ver, una imagen tiene una gran cantidad de campos que brindan todo tipo de información sobre ella. Aquí, estamos interesados en la etiqueta “roja”. Este campo es un booleano y la documentación nos dice que se puede escribir. Ahora solo necesitamos encontrar todas las imágenes con ese campo e imprimirlas:

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

Este código debería ser bastante simple de entender en este punto, pero contiene algunos aspectos interesantes de lua que vale la pena destacar:

  • ipairs es una función lua estándar que iterará a través de todos los índices numéricos de una tabla. Lo usamos aquí porque la base de datos de darktable tiene índices no numéricos que son funciones para manipular la base de datos en sí (agregar o eliminar imágenes, por ejemplo).

  • La iteración a través de una tabla devolverá tanto la clave como el valor utilizado. Es convencional en lua usar una variable llamada “_” para almacenar valores que no nos importan.

  • Tenga en cuenta que usamos la función lua estándar tostring aquí y no el darktable.debug.dump específico de darktable. La función estándar devolverá un nombre para el objeto mientras que la función de depuración imprimirá el contenido. La función de depuración sería demasiado detallada aquí. Una vez más, es una gran herramienta de depuración, pero no debe usarse para nada más.