Lightroomプラグインの開発—価値はありますか?


28

最近、写真の整理と管理のワークフローを「何もない」からLightroom 4にアップグレードしましたが、一般的にソフトウェアには非常に満足していますが、欠けている機能の1つは、自動化するマクロやスクリプトを記録する機能です反復的なタスク-Lightroomへの移行の過程で、やりたいことを繰り返したタスクがたくさんありました。これらのタスクのいくつかを行うためにLRプラグインを書く方法を学ぶ価値があるかどうか疑問に思っています。自動化したい種類の例を紹介します。

  • スタックされたRAW + PSD + JPG写真の大きなグループで、各スタック内のJPG拡張子を持つファイルを選択し、スタックの最上位にします
  • (既存の)RAWファイルから(既存の)JPEGファイルへのメタデータの一括コピーを実行する

スクリプトを使用してLightroom内の画像管理を現在よりもさらに簡単にする方法は他にもたくさんあります。私の質問には3つの部分があります。

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を見るアイデアを私に与えてくれたからです:
フランチェスコ

回答:


39

Luaで何もしていません

Luaはおそらく、私が知っている最も単純でクリーンなプログラミング言語です。(そして、私はいくつか知っています。)

Luaのシンプルさは最大の弱点でもあります:小さくてきれいな言語であるため、Javaのような工業用の言語やバッテリーから来る場合に期待するようなものはあまり組み込まれていません-Pythonのような組み込み言語。

LuaはCによって拡張されるように設計されています。この場合、LightroomのSDKを意味します。Luaに組み込まれていない必要なツールを提供するためにAdobeが作業を行った場合、それは素晴らしいことですが、たまに外部のツールを呼び出して作業を完了することになります。

Lightroom APIは簡単に接続できますか

これに関する唯一の注意点は、特定の方法でソースコードを構造化しInfo.lua、プラグインについてLightroomに伝えるための特別なファイルを提供する必要があることです。すべてSDKのドキュメントで説明されています。SDKには、便利な開始コードを探し出すことができるかなり精巧な「hello world」プラグインなど、開始する機能プラグインがいくつか含まれています。

開発には特別なツールが必要ですか?

テキストエディターだけで対応できます。

Lightroomにはデバッグ機能は組み込まれていませんが、SDKにはデバッグログ機能があります。これらのメッセージは、WinDbgWindowsまたは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がこれらの制限の1つであなたを捕まえようとするときはいつでも、しばしばエスケープハッチがあります。ExifToolをインストールして、たとえばLuaから呼び出すことができます。カタログメタデータと写真のメタデータの間に矛盾があるため、これは完璧なソリューションではありませんが、Lightroomは写真にバッジを付けて表示します。クリックすると、写真からメタデータをリロードして競合を解決できます。

(このようなプラグインを使用する場合は、[カタログ設定]ダイアログで[XMPへの変更を自動的に書き込む]オプションを設定する必要があります。そうしない、カタログ写真のメタデータの両方で双方向の競合が発生しやすくなります変更されました。Lightroomは、2つのメタデータセットをマージする方法を知りません; 1つを選択し、他のメタデータコピーを上書きします。)


SDKの制限は実際にはかなりのものであり、公式にサポートされているアクションは、このガイドによると、エクスポートまたは公開先の追加、エクスポートでの追加の後処理の適用、またはカスタムメタデータフィールドの追加のみです。答えが説明しているように、設定/値の更新が必要なアクションは、更新された値を設定しようとするまでサポートされる可能性があります。
スティーブンカニンガム

1
@StevenCunningham:そのガイドはチュートリアル文書です。SDKで実行できるすべてのことを包括的にリストすることを意図したものではありません。そのプログラマーズガイドに加えて、SDKにはHTMLリファレンスも含まれています。アドビがそのリファレンスで文書化したかなりの数のことは、彼らがあなたが指し示すPDFプログラマーズガイドでカバーしていなかったことです。LrPhoto:setRawMetadata()たとえば、セクションを参照してください。
ウォーレンヤング

1
いい答え-+1。
D.ランバート

4

Lightroomはわかりません(まだありますが、まだインストールしていません)が、しようとしていることの複雑さに応じて、AutoHotKeyのようなシステム全体のキーボードマクロ/自動化ツールを見たいと思うかもしれません。把握できるキーストロークのシーケンスを記録またはプログラムし、ホットキーを押すと、プログラム(LightRoomなど)でそれらを再生して、プログラムに関する限り-に見えるようにします。入力したように。これにより、アプリケーションプログラムをまったく変更することなく、あらゆる種類のものを自動化できます。


確かにプラグインはよりきめ細かい自動化ソリューションを提供します。これは一種の極端な比率であり、OSに依存します。プラグインは(多かれ少なかれ)WindowsとOSXの間で移植可能であると思います。
フランチェスコ

1
@Francesco-あなたは正しいと確信していますが、その道を進むには、おそらくもっと多くのプログラミングスキルとLightRoom API(またはマクロライターのインターフェイスと呼ばれるもの)の知識が必要です。かなりの数の人がマルチブートを行ったり、vmsを使用していますが、ほとんどの人はおそらく1つのOSに固執しており、Linux、Windows、およびOSX用の同様のマクロプロセッサがあります。難しいのは、一連のアクションを正しく行うことです。ほとんどの単純なことについて、あるマクロプロセッサから別のマクロプロセッサへの再コーディングはそれほど難しくありません。
ジョー

あなたの意見はわかりますが、私の意見では、元の質問を考えると少し範囲外です(OPはLuaだけでなく、一連の言語に精通しています)。いずれにせよ、あなたの答えは当面の問題に対する可能な解決策を提供するので、あなたの答えが落とされるに値するとは思いませんでした(それは一種の独創的なアプローチです、と私は言います)。
フランチェスコ

これは確かに有効なオプションであり、私は少し考えました。私は、Lightroom固有のアプローチを好むと思います。これは、寿命が長いようです。LightroomAPIは、OS依存のマクロソリューションよりもバージョンごとにあまり変化しないと予想しています。
デビッド

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の上だけでなく、プロジェクト全体を、しかし、上記のスニペットは、ファイル名ベースのバッチ処理タスクのためのベースとして使用することに問題ないはずです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.