Разработка плагина Lightroom - стоит ли это того?

28

Недавно я обновил рабочий процесс организации и управления фотографиями с «вообще ничего» до Lightroom 4, и, хотя я, как правило, очень доволен программным обеспечением, одной функции, которой ему крайне не хватает, является возможность записи любого рода макросов или сценариев для автоматизации повторяющиеся задачи - во время моей миграции в lightroom было много повторяющихся задач, которые я хотел выполнить, и мне интересно, стоит ли изучать, как писать плагины LR для выполнения некоторых из этих задач. Чтобы дать вам примеры видов вещей, которые я хочу автоматизировать:

  • В большой группе фотографий в стопке RAW + PSD + JPG выберите файл в каждой стопке с расширением JPG и сделайте его вершиной стопки
  • Выполните массовое копирование метаданных из (существующего) файла RAW в (существующий) файл JPEG

Я вижу множество других способов, с помощью которых скрипты могут сделать управление изображениями в Lightroom еще проще, чем сейчас. Мой вопрос состоит из трех частей:

1) Насколько сложно писать плагины Lightroom? Я хорошо разбираюсь в ряде языков программирования (C / C ++, Python, Perl), но я ничего не делал с Lua. Легко ли подключить Lightroom API и требуются ли какие-либо специализированные инструменты для разработки?

2) Могу ли я написать сценарии для выполнения задач, которые я легко описал выше?

3) Есть ли какие-нибудь полезные ресурсы или учебники, которые я могу прочитать, чтобы начать разработку плагинов для Lightroom?

Дэвид
источник
Я не могу влиять на разработку плагинов - на самом деле не смотрел на это - но похоже, что вы используете его специально для тех, кто не переходит от рабочего процесса к Lightroom. То есть, как только вы начнете использовать LR, вам больше не нужно будет копировать мета из RAW в .jpg или .psd, например, потому что в этом весь рабочий процесс.
Дан Вольфганг
Это правда, примеры, которые я даю мне (теоретически), больше никогда не понадобятся, когда я закончу с моим первоначальным импортом. Однако, может быть, в этом и есть другие задачи, которые я бы хотел автоматизировать в будущем? Я не уверен в этом. Но если достаточно просто разработать плагины, то обучение сейчас не повредит мне и может быть полезным в будущем. Если разработка плагинов сложна, то я не хочу беспокоиться и буду полагать, что Lightroom сделает большую часть того, что мне нужно, когда будет построена моя библиотека.
Дэвид
О, да, возможности автоматизации и подключения бесконечны. Я просто указал на это, потому что, в зависимости от размера вашей библиотеки, это может не стоить усилий (по крайней мере, для меня это не так).
Дэн Вольфганг
Хотя я не знаю, как сделать это с помощью Lightroom, вы можете создать программу для изменения данных EXIF ​​для всех ваших фотографий. Пожалуйста, проверьте archive.msdn.microsoft.com/changexifwithcsharp и stackoverflow.com/questions/58649/… и stackoverflow.com/questions/226973/how-to-edit-exif-data-in-net . Вы упомянули, что знаете C ++, я полагаю, что вы можете войти в C #
K ''
+1, так как этот вопрос дал мне идею посмотреть на этот Lua sdk :-)
Francesco

Ответы:

39

Я ничего не сделал с Луа

Lua , наверное, самый простой и чистый язык программирования, который я знаю. (И я знаю несколько .)

Простота Lua также является его самой большой слабостью: будучи маленьким, чистым языком по своему дизайну, в нем не так много встроенных вещей, которые вы ожидаете найти, когда исходите из языка промышленного уровня, такого как Java, или аккумуляторов. включенный язык, как Python.

Lua разработан для расширения на C, что в данном случае означает SDK Lightroom. Прекрасно, если Adobe выполнила работу по предоставлению необходимых инструментов, которые не встроены в Lua, но время от времени вы, вероятно, будете обращаться к внешним инструментам, чтобы добиться своей цели.

Легко ли подключить Lightroom API?

Единственная сложность в том, что вам нужно структурировать исходный код определенным образом и предоставить специальный Info.luaфайл, чтобы сообщить Lightroom о вашем плагине. Все это объясняется в документации по SDK . SDK включает в себя несколько функционирующих плагинов, в том числе довольно сложный плагин «hello world», который можно очистить для получения полезного стартового кода.

это требует каких-либо специализированных инструментов для разработки?

Вы можете обойтись только с помощью текстового редактора.

В Lightroom нет встроенного средства отладки, но в SDK есть средство ведения журнала отладки . Вы можете поймать эти сообщения в WinDbgWindows или ConsoleOS X.

Более свежей разработкой является ZeroBrane Studio с открытым исходным кодом Lua IDE. Вы можете использовать это вместо другого текстового редактора, но действительно круто то, что его можно подключить к работающему плагину, который позволяет отлаживать его во время работы. Я пробовал это, и это помогает сократить время цикла отладки исправления / перезагрузки / перезапуска.

Могу ли я написать сценарии для выполнения задач, которые я легко описал выше?

Я не думаю, что любая из этих задач на 100% выполнима с использованием только Lightroom SDK, но она может сделать большую часть работы за вас.

выберите файл в каждом стеке с расширением JPG и сделайте его вершиной стека

Вот некоторые смутно Lua-подобный код , чтобы вы почти всю дорогу:

for photo in catalog:getMultipleSelectedOrAllPhotos() do
    for peer in photo:stackInFolderMembers() do
        if string.find('%.jpg$', peer:getFormattedMetadata('fileName')) then
            -- *mumble* move 'peer' photo to top of stack *mumble*
            break
        end
    end
end

К сожалению, я не вижу способа в SDK выполнить действие этой самой внутренней строки комментария, по крайней мере, с LR 5. Лучшее, что я могу придумать, - это позвонить catalog:setSelectedPhotos(peer), а затем предоставить пользователю возможность фактически щелкнуть значок с номером, чтобы изменить порядок в стеке.

Выполните массовое копирование метаданных из (существующего) файла RAW в (существующий) файл JPEG

Вы можете сделать это с помощью существующего SDK, но есть ограничения.

Например, хотя вы можете прочитать значение поля EXIF dateTimeOriginal, в самом SDK нет возможности установить это значение. Я предполагаю, что это потому, что разработчики Lightroom решили, что это никогда не должно изменяться программно, что это ценная информация с камеры. (Почему так должно быть, когда есть пункт меню «Метаданные> Изменить время захвата ...», которого я не знаю, но он у вас есть.)

Но всякий раз, когда SDK пытается поймать вас в ловушку с одним из этих ограничений, часто есть запасной люк. Вы можете установить ExifTool и вызвать его, например, из Lua. Это не идеальное решение, потому что тогда у вас есть несоответствие между метаданными каталога и метаданными фотографии, но Lightroom заметит и поставит значок на фотографии, который при нажатии позволит вам разрешить конфликт путем перезагрузки метаданных из фотографии.

(При использовании такого плагина вы захотите установить параметр «Автоматически записывать изменения в XMP» в диалоговом окне «Параметры каталога». В противном случае вам будет проще создать двусторонний конфликт, в котором метаданные каталога и фотографии имеют Lightroom не знает, как объединить два набора метаданных, он заставляет вас выбрать один и перезаписывает другую копию метаданных.)

Уоррен Янг
источник
Ограничения SDK на самом деле существенны, единственными официально поддерживаемыми действиями в соответствии с данным руководством являются добавление пунктов назначения экспорта или публикации, применение дополнительной постобработки при экспорте или добавление настраиваемых полей метаданных. Любое действие, которое требует обновления любого параметра / значения, как описано в ответе, вероятно, поддерживается вплоть до тех пор, пока вы не попытаетесь установить обновленное значение.
Стивен Каннингем
1
@StevenCunningham: это руководство является учебным документом; Он не предназначен для полного перечисления всего, что вы можете сделать с помощью SDK. В дополнение к этому руководству для программиста SDK также содержит HTML-ссылку. В этой ссылке Adobe задокументировала довольно много вещей, которые они не затронули в руководстве по программированию PDF, на которое вы указали. Смотрите LrPhoto:setRawMetadata()раздел, например.
Уоррен Янг
1
Хороший ответ - +1.
Д. Ламберт
4

Я не знаю Lightroom (пока - есть, но еще не установил его), но в зависимости от сложности того, что вы пытаетесь сделать, вы можете захотеть взглянуть на системный макрос / инструмент автоматизации клавиатуры, такой как AutoHotKey. , Он позволяет вам записывать или программировать любую последовательность нажатий клавиш, которую вы можете выяснить, а затем, когда вы нажимаете горячую клавишу, он воспроизводит их обратно в вашу программу (например, LightRoom), так что - с точки зрения программы - он выглядит как ты набрал это. Это позволяет вам автоматизировать все виды вещей без необходимости вообще изменять ваши прикладные программы.

Джо
источник
Конечно, плагин предложит более тонкое решение для автоматизации, это своего рода экстремальное соотношение и зависит от ОС. Я предполагаю, что плагины (более или менее) переносимы между Windows и OSX.
Франческо
1
@Francesco - я уверен, что вы правы, но вам, вероятно, нужно гораздо больше навыков программирования и знания API LightRoom (или как они называют интерфейс для макросов), чтобы идти по этому пути. Хотя значительное количество людей используют мультизагрузку или используют vms, большинство людей, вероятно, придерживаются одной ОС, и для Linux, Windows и OSX существуют похожие макропроцессоры. Сложной частью является правильная последовательность действий. Для самых простых вещей перекодирование из одного макропроцессора в другой не очень сложно.
Джо
Я понимаю вашу точку зрения, но, на мой взгляд, это немного выходит за рамки данного оригинального вопроса (OP хорошо разбирается в ряде языков, но не в Lua). В любом случае, я не думал, что ваш ответ заслуживает того, чтобы его опровергли, поскольку он обеспечивает возможное решение проблемы (я бы сказал, это своего рода продуманный подход).
Франческо
Это, безусловно, правильный вариант, и я немного подумал об этом. Я думаю, что я бы предпочел подход, ориентированный на Lightroom, который, как представляется, имеет больший срок службы - я ожидаю, что Lightroom API будет меняться меньше от версии к версии, чем зависящее от ОС макрорешение.
Дэвид
2

Я просто хотел посмотреть, как выполнять пакетную обработку на основе имен файлов в Lightroom, и почему-то это выглядело так, как будто проще всего сделать это через API. Основываясь на посте @ Уоррена, мне удалось создать этот внутренний цикл для кнопки на форме, где я также мог бы поместить текстовое поле для регистрации ( logs_field) и некоторые входные значения (например, текстовое поле для включения имен файлов filenames_fieldи некоторых дополнительных параметров для пакета. обработка в rating_field):

f:push_button {
      title = "Update",
      action = function()
        import "LrTasks".startAsyncTask( function()
          logs_field.value = "Starting search\n"

          local catalog = import "LrApplication".activeCatalog()
          catalog:withWriteAccessDo("Batch set rating", function( context )
            for i,photo in ipairs(catalog:getAllPhotos()) do
              for fname in string.gmatch(filenames_field.value, "%w+") do
                if string.find(photo:getFormattedMetadata('fileName'), fname) then
                  logs_field.value = logs_field.value .. "Found filename: " .. fname .. "\n"
                  photo:setRawMetadata('label', rating_field.value)
                  photo:setRawMetadata('colorNameForLabel', rating_field.value)
                end
              end
            end
          end)
          logs_field.value = logs_field.value .. "Done...\n"
        end)
      end
 }

Этот фрагмент код будет пройти через несколько шаблонов имен файлов и применить ярлык на все фотографиях (вы можете заменить getAllPhotosс getMultipleSelectedOrAllPhotosв случае , если вам нужно только запустить его на некоторых из ваших фотографий) , которые соответствуют этим моделям. Я должен был сделать это, так как я уже пометил фотографии за пределами Lightroom, но мне нужен был простой способ переместить эти теги в LR на основе имен файлов.

Я также разместил весь проект на github , но приведенный выше фрагмент кода вполне подойдет для использования в качестве основы для задач пакетной обработки на основе имен файлов.

SztupY
источник