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,例如,因为这就是工作流程的全部内容。
丹·沃尔夫冈2012年

没错,完成我的初始导入后,从理论上讲,我给出的示例将不再需要进行。但是,也许将来还有其他我想能够自动化的任务呢?我不确定这一点。但是,如果开发插件很容易,那么现在学习对我来说就没有伤害,并且将来可能会受益。如果插件开发很复杂,那么我不想打扰,并且会相信,一旦构建了库,Lightroom就可以满足我的大部分需求。
David

哦,是的,自动化和连接选项是无限的。我只是指出这一点,因为根据您的库的大小,这可能不值得付出努力(至少对我而言不是这样)。
丹·沃尔夫冈

虽然我不知道如何使用Lightroom做到这一点,但实际上您可以构建一个程序来更改所有照片的EXIF数据。请检查archive.msdn.microsoft.com/changexifwithcsharpstackoverflow.com/questions/58649/…以及stackoverflow.com/questions/226973/how-to-edit-exif-data-in-net。您提到您了解C ++,我相信您可以使用C#
K''

+1,因为这个问题使我想到了看一下Lua sdk的想法:-)
Francesco

Answers:


39

我对Lua没做任何事

Lua可能是我所知道的最简单,最简洁的编程语言。(我知道一些。)

Lua的简单性也是它的最大弱点:从设计上讲,它是一种小型,简洁的语言,它没有内置很多东西,而这些东西是您希望从诸如Java之类的工业级语言或电池中找到的。 -包括的语言,例如Python。

Lua设计为由C扩展,在这种情况下,这意味着Lightroom的SDK。如果Adobe已完成工作,以提供Lua尚未内置的所需工具,那就太好了,但是有时您可能会发现自己需要外部工具来完成工作。

Lightroom API是否易于使用

唯一棘手的部分是,您需要以特定方式构建源代码并提供一个特殊Info.lua文件来告诉Lightroom有关您的插件的信息。所有这些都在SDK docs中进行了说明。该SDK包括几个可运行的插件,包括一个相当复杂的“ hello world”插件,可以将其清除以获取有用的起始代码。

需要开发专用工具吗?

您仅需使用文本编辑器即可解决问题。

Lightroom中没有内置调试工具,但SDK中有调试日志记录工具。您可以WinDbg在Windows或ConsoleOS X 上捕获这些消息。

开源的ZeroBrane Studio Lua IDE 是最新的开发。您可以使用它而不是其他文本编辑器,但真正的酷处是可以将其附加到正在运行的插件上,从而可以在运行时对其进行调试。我已经尝试过了,它确实有助于减少修复/重新加载/重新启动调试周期的时间。

我可以编写脚本轻松执行上面描述的任务吗?

我不认为仅使用Lightroom SDK就能100%完成任何一项任务,但是它可以为您完成很多工作。

在每个堆栈中选择带有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

不幸的是,至少在LR 5上,我没有看到SDK中执行此最深注释行的方法。我能想到的最好的方法是致电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。
D. Lambert 2012年

4

我不知道Lightroom(尚未安装-但尚未安装),但是根据您尝试执行的操作的复杂程度,您可能需要查看系统范围的键盘宏/自动化工具,例如AutoHotKey 。它使您可以记录或编程任何可以找出的按键序列,然后在按热键时将它们回放到您的程序(例如LightRoom)中,以便就程序而言就像您键入它一样。这使您可以自动进行各种操作,而无需修改您的应用程序。


当然,插件将提供更精细的自动化解决方案,这是一种极端的比率,并且取决于操作系统。我认为插件(或多或少)可在Windows和OSX之间移植。
Francesco

1
@Francesco-我确定您是对的,但是您可能需要更多的编程技能和LightRoom API的知识(或他们称之为宏编写器的接口)才能走这条路。尽管相当多的人会进行多次引导或使用vms,但大多数人可能会坚持使用一个OS,并且对于Linux,Windows和OSX也有类似的宏处理器。困难的部分是正确执行操作顺序。对于大多数简单的事情,从一个宏处理器到另一个宏处理器的编码并不是很困难。
2012年

我明白您的意思,但我认为,考虑到最初的问题(OP非常精通一系列语言,而并非Lua),这有点超出范围。无论如何,我认为您的答案不应该被低估,因为它为眼前的问题提供了一种可能的解决方案(我想这是一种开箱即用的方法。
Francesco 2012年

这当然是一个有效的选择,我已经考虑了一些。我想我更喜欢Lightroom特定的方法,该方法似乎具有更长的使用寿命-我希望Lightroom API的版本之间的变化比依赖于操作系统的宏解决方案的变化少。
David

2

我只是想看看如何在Lightroom中基于文件名进行批处理,由于某种原因,它似乎最简单的方法是通过API。根据@Warren的帖子,我设法为表单上的按钮创建了这个内部循环,我还可以在其中放置一个用于记录日志的文本字段(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
 }

这段代码将通过一些文件名模式,并且将标签应用到所有照片(你可能要替换getAllPhotosgetMultipleSelectedOrAllPhotos的情况下,你只需要在您的一些图片运行)匹配模式,。我必须这样做,因为我已经在Lightroom外部标记了照片,但是需要一种简单的方法,也可以根据文件名将这些标记移动到LR中。

我也将整个项目放在github上,但是上面的代码片段可以用作基于文件名的批处理任务的基础。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.