imprimir imagens com etiqueta

O primeiro exemplo nos mostrou os conceitos básicos de Lua e permitiu que nos certificássemos de que tudo está funcionando corretamente. Agora vamos fazer algo um pouco mais complexo. Vamos tentar imprimir uma lista de imagens que possuam a etiqueta “vermelho” adicionada. Mas primeiramente o que é uma imagem?

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

Executar o código acima produzirá uma grande quantidade de resultados. Vamos dar uma olhada nesses resultados daqui a pouco, mas primeiro vejamos o código em si.

Já sabemos sobre require darktable. Aqui, precisamos require darktable.debug em separado, que é uma seção opcional da API que fornece funções auxiliares para ajudar a depurar scripts lua.

O darktable.database é uma tabela fornecida pela API que contém todas as imagens da base de dados da biblioteca. Cada entrada na base de dados é um objeto de imagem. Objetos de imagem são objetos complexos que permitem que você manipule sua imagem de diversos modos (todos eles documentados na seção types_dt_lua_image_t do manual da API). Para exibir nossas imagens, usamos o darktable.debug.dump, que é uma função que recebe qualquer coisa como parâmetro e devolve recursivamente seu conteúdo. Uma vez que as imagens são objetos complexos que indiretamente referenciam outros objetos complexos, a saída resultante é imensa. Abaixo é mostrado um exemplo reduzido da saída.

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, uma imagem possui um grande número de campos que fornece todo tipo de informação sobre ela. Aqui, estamos interessados na etiqueta “vermelho”. Este campo é booleano e a documentação nos informa que pode ser editado. Nós agora apenas precisamos encontrar todas as imagens com este campo e imprimi-las:

darktable = require “darktable”
for _,v in ipairs(darktable.database) do
  if v.vermelho then
    print(tostring(v))
  end
end

Este código deveria ser simples de entender neste ponto, mas contém alguns aspectos interessantes de lua que merecem destaque.

  • ipairs é uma função padrão lua que itera por todos os índices numéricos de uma tabela. Nós a usamos aqui porque a base de dados do darktable tem índices não numéricos que são funções para manipular a própria base de dados (adicionar ou remover imagens, por exemplo).

  • Iterar por uma tabela retornará tanto a chave como o valor usados. É convencional em lua usar uma variável de nome “_” para armazenar valores com os quais não nos importamos.

  • Note que usamos a função padrão lua tostring aqui e não a função específica do darktable chamada darktable.debug.dump. A função padrão retornará um nome para o objeto enquanto a função de depuração (debug) mostrará o conteúdo dele. A função de depuração seria prolixa demais aqui. Novamente, é uma ótima ferramenta para depuração, mas não deveria ser usada para nada além disso.

translations