Lightroom-Plugin-Entwicklung - lohnt es sich?


28

Ich habe kürzlich meinen Workflow für die Organisation und Verwaltung von Fotos von "überhaupt nichts" auf Lightroom 4 aktualisiert. Obwohl ich mit der Software im Allgemeinen sehr zufrieden bin, fehlt eine Funktion, die das Aufzeichnen von Makros oder Skripten zur Automatisierung ermöglicht repetitive aufgaben - Während meiner Migration in Lightroom gab es viele repetitive Aufgaben, die ich ausführen wollte, und ich frage mich, ob es sich lohnt, zu lernen, wie man LR-Plugins schreibt, um einige dieser Aufgaben auszuführen. Um Ihnen Beispiele für die Dinge zu geben, die ich automatisieren möchte:

  • Wählen Sie in einer großen Gruppe gestapelter RAW + PSD + JPG-Fotos die Datei in jedem Stapel mit der JPG-Erweiterung aus und legen Sie sie oben auf dem Stapel ab
  • Führen Sie eine Massenkopie von Metadaten aus einer (vorhandenen) RAW-Datei in eine (vorhandene) JPEG-Datei durch

Ich kann viele andere Möglichkeiten erkennen, mit denen Skripte das Image-Management in Lightroom noch einfacher gestalten können als jetzt. Meine Frage besteht dann aus drei Teilen:

1) Wie schwierig ist es, Lightroom-Plugins zu schreiben? Ich bin mit einer Reihe von Programmiersprachen (C / C ++, Python, Perl) vertraut, aber mit Lua habe ich nichts gemacht. Ist die Lightroom-API einfach zu integrieren und erfordert sie spezielle Tools für die Entwicklung?

2) Kann ich Skripte schreiben, um die von mir beschriebenen Aufgaben problemlos auszuführen?

3) Gibt es gute Ressourcen oder Tutorials, die ich lesen kann, um mit der Entwicklung von Lightroom-Plugins zu beginnen?


Ich kann mich nicht mit der Plugin-Entwicklung auseinandersetzen - ich habe mir das nicht wirklich angesehen -, aber es scheint, als ob Ihre Anwendungen speziell für jemanden gedacht sind, der von keinem Workflow zu Lightroom übergeht. Das heißt, sobald Sie mit der Verwendung von LR beginnen, müssen Sie kein Meta mehr von einer RAW-Datei in eine JPG- oder eine PSD-Datei kopieren, zum Beispiel, weil der Workflow genau darum geht.
Dan Wolfgang

Das stimmt, die Beispiele, die ich (theoretisch) gebe, werden ich nie wieder tun müssen, wenn ich mit meinem anfänglichen Import fertig bin. Vielleicht gibt es aber noch andere Aufgaben, die ich zukünftig automatisieren möchte? Da bin ich mir nicht sicher. Aber wenn es einfach genug ist, Plugins zu entwickeln, schadet mir das Lernen nicht und könnte in Zukunft von Vorteil sein. Wenn die Plugin-Entwicklung komplex ist, möchte ich mich nicht darum kümmern und vertraue darauf, dass Lightroom das meiste leistet, was ich brauche, sobald meine Bibliothek erstellt ist.
David

Oh ja, die Automations- und Konnektivitätsoptionen sind unendlich. Ich habe nur darauf hingewiesen, weil es abhängig von der Größe Ihrer Bibliothek den Aufwand möglicherweise nicht wert ist (zumindest für mich war es das nicht).
Dan Wolfgang

Ich kenne zwar keine Möglichkeit, dies mit Lightroom zu tun, aber Sie können tatsächlich ein Programm erstellen, um die EXIF-Daten für alle Ihre Fotos zu ändern. Bitte überprüfen Sie archive.msdn.microsoft.com/changexifwithcsharp und stackoverflow.com/questions/58649/… und stackoverflow.com/questions/226973/how-to-edit-exif-data-in-net . Sie haben erwähnt, dass Sie C ++ kennen. Ich glaube, Sie können sich um
K ''

+1, da diese Frage mich auf die Idee brachte, diese Lua SDK anzuschauen :-)
Francesco

Antworten:


39

Ich habe nichts mit Lua gemacht

Lua ist wahrscheinlich die einfachste und sauberste Programmiersprache, die ich kenne. (Und ich kenne ein paar .)

Die Einfachheit von Lua ist auch seine größte Schwäche: Da es sich um eine kleine, übersichtliche Sprache handelt, sind nicht viele Dinge eingebaut, die Sie erwarten würden, wenn Sie aus einer industriellen Sprache wie Java oder einer Batterie stammen Sprache wie Python.

Lua ist so konzipiert, dass es von C erweitert wird, was in diesem Fall das SDK von Lightroom bedeutet. Das ist großartig, wenn Adobe die Arbeit geleistet hat, um die Tools bereitzustellen, die Sie benötigen, die nicht in Lua integriert sind, aber ab und zu werden Sie wahrscheinlich externe Tools in Anspruch nehmen müssen, um die Dinge zu erledigen.

Ist die Lightroom-API einfach zu integrieren?

Das einzig schwierige daran ist, dass Sie Ihren Quellcode auf eine bestimmte Weise strukturieren und eine spezielle Info.luaDatei bereitstellen müssen , um Lightroom über Ihr Plugin zu informieren. Alles wird in den SDK-Dokumenten erklärt . Das SDK enthält mehrere funktionierende Plugins, von denen aus man starten kann, einschließlich eines ziemlich ausgeklügelten "Hallo Welt" -Plugins, das nach nützlichem Startcode durchsucht werden kann.

Benötigt es spezielle Tools für die Entwicklung?

Sie kommen mit nur einem Texteditor zurecht.

In Lightroom ist keine Debugging-Funktion integriert, das SDK enthält jedoch eine Debugging-Funktion . Sie können diese Meldungen entweder WinDbgunter Windows oder Consoleunter OS X abfangen.

Eine neuere Entwicklung ist die Open Source ZeroBrane Studio Lua IDE. Sie können dies anstelle eines anderen Texteditors verwenden, aber das wirklich coole ist, dass es möglich ist, es an Ihr laufendes Plugin anzuhängen, wodurch Sie es während der Ausführung debuggen können. Ich habe dies versucht, und es hilft, die Zykluszeit für das Beheben / Neuladen / Neustarten des Debugs zu verkürzen.

Kann ich Skripte schreiben, um die oben beschriebenen Aufgaben problemlos auszuführen?

Ich denke nicht, dass eine der beiden Aufgaben zu 100% nur mit dem Lightroom SDK erledigt werden kann, aber es kann einen Großteil der Arbeit für Sie erledigen.

Wählen Sie die Datei in jedem Stapel mit der JPG-Erweiterung aus und legen Sie sie oben auf dem Stapel ab

Hier ist ein vage Lua-ähnlicher Code, mit dem Sie fast den gesamten Weg dorthin zurücklegen können:

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

Leider sehe ich im SDK keine Möglichkeit, die Aktion der innersten Kommentarzeile auszuführen, zumindest ab LR 5. Am besten rufe ich an catalog:setSelectedPhotos(peer)und überlasse es dann dem Benutzer, auf das Nummernschild zu klicken, um den Stapel neu zu ordnen.

Führen Sie eine Massenkopie von Metadaten aus einer (vorhandenen) RAW-Datei in eine (vorhandene) JPEG-Datei durch

Sie können einen Teil davon mit dem vorhandenen SDK ausführen, es gibt jedoch Einschränkungen.

Zum Beispiel, während Sie lesen den Wert des EXIF - dateTimeOriginalFeld gibt es keine Möglichkeit , im SDK selbst setzen Sie den Wert. Ich nehme an, das liegt daran, dass die Lightroom-Entwickler entschieden haben, dass dies niemals programmgesteuert geändert werden sollte. Das sind wertvolle Informationen von der Kamera. (Warum dies der Fall sein sollte, wenn es einen Menüpunkt Metadaten> Aufnahmezeit bearbeiten ... gibt, weiß ich nicht, aber Sie haben ihn.)

Wenn das SDK jedoch versucht, Sie mit einer dieser Einschränkungen zu überlisten, gibt es häufig eine Notausstiegsluke. Sie können beispielsweise ExifTool installieren und von Lua aus aufrufen. Dies ist keine perfekte Lösung, da es dann zu Inkonsistenzen zwischen den Katalog-Metadaten und den Foto-Metadaten kommt. Lightroom erkennt das Foto jedoch und versieht es mit einem Symbol. Wenn Sie darauf klicken, können Sie den Konflikt lösen, indem Sie die Metadaten aus dem Foto neu laden.

(Wenn Sie ein solches Plugin verwenden, sollten Sie die Option "Änderungen automatisch in XMP schreiben" im Dialogfeld "Katalogeinstellungen" festlegen. Andernfalls können Sie leichter einen bidirektionalen Konflikt erstellen, bei dem sowohl Katalog- als auch Fotometadaten vorhanden sind Lightroom weiß nicht, wie die beiden Metadatensätze zusammengeführt werden sollen. Sie müssen nur einen auswählen und überschreiben damit die andere Metadatenkopie.)


Die Einschränkungen des SDK sind tatsächlich erheblich. Die einzigen offiziell unterstützten Aktionen laut diesem Handbuch sind das Hinzufügen von Export- oder Veröffentlichungszielen, das Anwenden zusätzlicher Nachbearbeitung beim Export oder das Hinzufügen benutzerdefinierter Metadatenfelder. Jede Aktion, die eine Aktualisierung einer Einstellung oder eines Werts erfordert, wird, wie in der Antwort beschrieben, wahrscheinlich unterstützt, bis Sie versuchen, den aktualisierten Wert festzulegen.
Steven Cunningham

1
@StevenCunningham: Dieser Leitfaden ist ein Tutorial-Dokument. Es ist nicht dazu gedacht, alle Dinge, die Sie mit dem SDK tun können, umfassend aufzulisten. Zusätzlich zu diesem Programmierhandbuch enthält das SDK auch eine HTML-Referenz. In dieser Referenz sind einige Dinge dokumentiert, auf die Adobe in der Anleitung für PDF-Programmierer, auf die Sie verweisen, nicht eingegangen ist. Siehe LrPhoto:setRawMetadata()zum Beispiel den Abschnitt.
Warren Young

1
Schöne Antwort - +1.
D. Lambert

4

Ich kenne Lightroom noch nicht (habe es, habe es aber noch nicht installiert), aber je nach Komplexität Ihrer Versuche möchten Sie sich vielleicht ein systemweites Tastaturmakro- / Automatisierungstool wie AutoHotKey ansehen . Damit können Sie eine beliebige Folge von Tastenanschlägen aufzeichnen oder programmieren, die Sie herausfinden können. Wenn Sie dann eine Tastenkombination drücken, werden diese in Ihrem Programm (z. B. LightRoom) wiedergegeben, sodass das Programm so aussieht, wie es ist wie du es geschrieben hast. Auf diese Weise können Sie alle möglichen Dinge automatisieren, ohne Ihre Anwendungsprogramme ändern zu müssen.


Sicherlich wird ein Plugin eine feinkörnigere Automatisierungslösung bieten. Dies ist eine Art extremes Verhältnis und abhängig vom Betriebssystem. Ich gehe davon aus, dass Plugins (mehr oder weniger) zwischen Windows und OSX portierbar sind.
Francesco

1
@Francesco - Ich bin mir sicher, dass Sie Recht haben, aber Sie benötigen wahrscheinlich viel mehr Programmierkenntnisse und Kenntnisse der LightRoom-API (oder wie auch immer die Schnittstelle für Makroschreiber genannt wird), um diesen Weg zu beschreiten. Obwohl eine große Anzahl von Leuten Multiboot oder VMS verwendet, bleiben die meisten Leute wahrscheinlich bei einem Betriebssystem und es gibt ähnliche Makroprozessoren für Linux, Windows und OSX. Der schwierige Teil ist die richtige Reihenfolge der Aktionen. Für die meisten einfachen Dinge ist das Umcodieren von einem Makroprozessor auf einen anderen nicht sehr schwierig.
Joe

Ich verstehe Ihren Standpunkt, aber meiner Meinung nach ist er in Anbetracht der ursprünglichen Frage etwas unangebracht (OP beherrscht eine Reihe von Sprachen, nur nicht Lua). Auf jeden Fall hätte ich nicht gedacht, dass Ihre Antwort eine Abwertung verdient, da sie eine mögliche Lösung für das vorliegende Problem darstellt (ich würde sagen, es handelt sich um eine Art "Think-out-of-the-Box" -Ansatz).
Francesco

Dies ist sicherlich eine gültige Option, und ich habe ein wenig darüber nachgedacht. Ich würde einen Lightroom-spezifischen Ansatz bevorzugen, der eine längere Lebensdauer zu haben scheint. Ich gehe davon aus, dass sich die Lightroom-API von Version zu Version weniger ändert als eine betriebssystemabhängige Makrolösung.
David

2

Ich wollte nur sehen, wie die Stapelverarbeitung basierend auf Dateinamen in Lightroom durchgeführt wird, und aus irgendeinem Grund sah es so aus, als ob dies am einfachsten über die API möglich wäre. Basierend auf dem Beitrag von @ Warren habe ich es geschafft, diese innere Schleife für eine Schaltfläche in einem Formular zu erstellen, in dem ich auch ein Textfeld für die Protokollierung ( logs_field) und einige Eingabewerte (z. B. ein Textfeld mit den Dateinamen filenames_fieldund einigen zusätzlichen Parametern für den Stapel) einfügen konnte Bearbeitung in 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
 }

Dieses Snippet durchläuft einige Dateinamenmuster und weist allen Fotos, die getAllPhotosmit getMultipleSelectedOrAllPhotosdiesen Mustern übereinstimmen , eine Bezeichnung zu (die Sie möglicherweise ersetzen möchten, falls Sie sie nur für einige Ihrer Bilder ausführen müssen). Ich musste dies tun, da ich die Fotos bereits außerhalb von Lightroom mit Tags versehen hatte, aber ich brauchte eine einfache Möglichkeit, um diese Tags auch basierend auf den Dateinamen in LR zu verschieben.

Ich habe das gesamte Projekt auch auf Github geschrieben , aber das obige Snippet sollte in Ordnung sein, um als Grundlage für dateibasierte Stapelverarbeitungsaufgaben zu dienen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.