Друк зображень із міткою

Перший приклад показав нам самі основи Lua і дозволив перевірити, чи все працює належним чином. А тепер зробімо щось дещо складніше. Спробуємо надрукувати список зображень, до яких прикріплена “червона” позначка. Але перш за все, що таке зображення?

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

Запуск наведеного вище коду дасть багато результату на виході. Ми розглянемо це за мить, але спочатку розглянемо сам код.

Ми знаємо про require darktable. Тут нам потрібно окремо require darktable.debug, що є необов’язковим розділом API, який надає допоміжні функції для допомоги у налагодженні сценаріїв Lua.

darktable.database – це таблиця, надана API, яка містить усі зображення в базі даних бібліотеки. Кожен запис у базі даних є об’єктом зображення. Об’єкти зображення – це складні об’єкти, які дозволяють маніпулювати вашим зображенням різними способами (все це задокументовано в розділі types_dt_lua_image_t посібника з API). Для відображення наших зображень ми використовуємо darktable.debug.dump, яка є функцією, що приймає будь-що як свій параметр і рекурсивно скидає його вміст. Оскільки зображення – це складні об’єкти, які опосередковано посилаються на інші складні об’єкти, результат цього є величезним. Нижче наведено зрізаний приклад результату.

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

Як ми бачимо, зображення має велику кількість полів, які надають всю інформацію про нього. Тут нас цікавить “червона” позначка. Це поле має логічний тип даних, і документація повідомляє нам, що його можна записати. Тепер нам просто потрібно знайти всі зображення з цим полем і роздрукувати їх:

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

На цьому етапі цей код повинен бути досить простим для розуміння, але він містить кілька цікавих аспектів Lua, які варто виділити:

  • ipairs – це стандартна функція Lua, яка буде перебирати всі числові індекси таблиці. Ми використовуємо її тут, оскільки база даних Darktable має нечислові індекси, які є функціями для роботи з самою базою даних (наприклад, додавання або видалення зображень).

  • Ітерація по таблиці поверне як ключ, так і використане значення. В Lua узвичаєно використовувати змінну з назвою “_” для зберігання значень, які нас не хвилюють.

  • Зверніть увагу, що тут ми використовуємо стандартну функцію Lua tostring, а не специфічну для Darktabledarktable.debug.dump. Стандартна функція поверне ім’я об’єкта, тоді як функція налагодження надрукує вміст. Тут функція налагодження буде занадто багатослівною. Ще раз, це чудовий інструмент налагодження, але його не слід використовувати ні для чого іншого.

translations