друк зображень із міткою
Перший приклад показав нам самі основи 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
. Стандартна функція поверне ім’я об’єкта, тоді як функція налагодження надрукує вміст. Тут функція налагодження буде занадто багатослівною. Ще раз, це чудовий інструмент налагодження, але його не слід використовувати ні для чого іншого.