Lightroom 플러그인 개발 – 그만한 가치가 있습니까?


28

최근에 사진 구성 및 관리 워크 플로우를 "아무것도없는 것"에서 Lightroom 4로 업그레이드했으며, 일반적으로 소프트웨어에 매우 만족하지만, 부족한 한 가지 기능은 자동화 할 매크로 또는 스크립트를 기록하는 기능입니다. 반복적 인 작업-라이트 룸으로 마이그레이션하는 과정에서 반복적 인 작업이 많았으며이 작업 중 일부를 수행하기 위해 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로 메타를 복사 할 필요가 없습니다. 예를 들어 워크 플로가 전부이기 때문입니다.
Dan Wolfgang

사실, 내가 (이론적으로) 제공 한 예제는 처음 가져 오기가 완료되면 다시 할 필요가 없습니다. 그러나 앞으로 자동화 할 수있는 다른 작업이있을 수 있습니까? 이 숫자를 잘 모르겠습니다. 그러나 플러그인을 개발하기가 쉽다면 지금 배우는 것이 나에게 해를 끼치 지 않으며 앞으로 도움이 될 수 있습니다. 플러그인 개발이 복잡하다면 귀찮게하고 싶지 않으며 라이브러리가 구축되면 Lightroom이 필요한 대부분의 작업을 수행 할 것이라고 믿습니다.
David

예, 자동화 및 연결 옵션은 무한합니다. 도서관의 규모에 따라 노력할만한 가치가 없기 때문에 지적했습니다 (적어도 나에게는 그렇지 않았습니다).
Dan Wolfgang

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

답변:


39

루아와 아무 짓도 안 했어요

루아 는 아마도 내가 아는 가장 단순하고 깨끗한 프로그래밍 언어 일 것입니다. (그리고 나는 몇 가지를 안다 .)

Lua의 단순성은 또한 가장 큰 약점입니다. 설계 상 작고 깨끗한 언어이기 때문에 Java와 같은 산업 등급 언어 또는 배터리에서 찾을 때 기대할 수있는 많은 것들이 내장되어 있지 않습니다. 파이썬과 같은 언어.

Lua는 C에 의해 확장되도록 설계되었으며이 경우 Lightroom의 SDK를 의미합니다. Adobe가 Lua에 내장되어 있지 않은 필요한 도구를 제공하기 위해 작업을 수행 한 경우 매우 유용하지만, 이제는 외부 도구를 호출하여 작업을 수행하게 될 것입니다.

Lightroom API를 쉽게 연결할 수 있습니까?

그것에 대한 유일한 까다로운 부분은 소스 코드를 특정 방식으로 구성하고 Info.lua플러그인에 대해 Lightroom에 알리는 특수 파일을 제공해야한다는 것 입니다. 그것은 모두 SDK docs에 설명 되어 있습니다 . 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가 이러한 제한 중 하나를 사용하려고 할 때마다 이스케이프 해치가 종종 발생합니다. 예를 들어 ExifTool 을 설치 하고 Lua에서 호출 할 수 있습니다 . 카탈로그 메타 데이터와 사진 메타 데이터 사이에 불일치가 있기 때문에 완벽한 솔루션은 아니지만 Lightroom은 사진에 배지를 표시하고이를 클릭하면 사진에서 메타 데이터를 다시로드하여 충돌을 해결할 수 있습니다.

(그러한 플러그인을 사용할 때 카탈로그 설정 대화 상자에서 "XMP에 자동으로 변경 사항 쓰기"옵션을 설정하려고합니다. 그렇지 않으면 카탈로그 사진 메타 데이터가 모두있는 양방향 충돌을보다 쉽게 ​​만들 수 있습니다. Lightroom은 두 가지 메타 데이터 세트를 병합하는 방법을 모릅니다. 하나를 선택하고 다른 메타 데이터 사본을 덮어 씁니다.)


SDK의 한계는 실제로 중요합니다. 이 가이드에 따라 공식적으로 지원되는 유일한 조치 는 내보내기 또는 게시 대상 추가, 내보내기시 추가 사후 처리 적용 또는 사용자 지정 메타 데이터 필드 추가입니다. 답변에 설명 된대로 설정 / 값을 업데이트해야하는 작업은 업데이트 된 값을 시도하고 설정할 때까지 바로 지원 될 수 있습니다.
Steven Cunningham

1
@StevenCunningham :이 안내서는 튜토리얼 문서입니다. SDK로 수행 할 수있는 모든 작업을 종합적으로 나열하기위한 것은 아닙니다. SDK에는 해당 프로그래머 안내서 외에 HTML 참조도 포함되어 있습니다. Adobe가 참조한 PDF 프로그래머 안내서에서 다루지 않은 내용을 참고로 문서화 한 내용이 많이 있습니다. LrPhoto:setRawMetadata()예를 들어 섹션을 참조하십시오 .
워렌 영

1
좋은 답변-+1.
D. Lambert

4

Lightroom을 모르지만 (아직 설치하지 않았지만) 수행하려는 작업의 복잡성에 따라 AutoHotKey와 같은 시스템 전체 키보드 매크로 / 자동화 도구를보고 싶을 수 있습니다. . 이를 통해 파악할 수있는 일련의 키 입력을 기록하거나 프로그래밍 할 수 있습니다. 그런 다음 단축키를 누르면 프로그램 (예 : LightRoom)으로 다시 재생되어 프로그램에 관한 한 프로그램이 보이도록합니다. 당신이 입력 한 것처럼. 이를 통해 응용 프로그램을 전혀 수정하지 않고도 모든 종류의 작업을 자동화 할 수 있습니다.


플러그인은 더 세밀한 자동화 솔루션을 제공 할 것입니다. 이것은 극단적 인 비율과 OS에 따라 다릅니다. 나는 플러그인이 Windows와 OSX간에 이식 가능하다고 가정합니다.
프란체스코

1
@Francesco-나는 당신이 옳다고 확신하지만, 그 길을 가기 위해서는 훨씬 더 많은 프로그래밍 기술과 LightRoom API (또는 매크로 작성자를위한 인터페이스라고 부르는 것)에 대한 지식이 필요할 것입니다. 상당히 많은 사람들이 멀티 부팅을하거나 vms를 사용하지만 대부분의 사람들은 하나의 OS를 고수하고 Linux, Windows 및 OSX를위한 유사한 매크로 프로세서가 있습니다. 어려운 부분은 일련의 행동을 올바르게 얻는 것입니다. 대부분의 간단한 작업을 위해 하나의 매크로 프로세서에서 다른 매크로 프로세서로 레코딩하는 것은 그리 어렵지 않습니다.
Joe

나는 당신의 요점을 알지만 내 의견으로는 원래의 질문에 비하면 범위가 약간 벗어났습니다 (OP는 루아가 아닌 일련의 언어로 잘 정통합니다). 어쨌든 나는 당신의 대답이 당면한 문제에 대한 가능한 해결책을 제공하기 때문에 하향 투표를받을 가치가 있다고 생각하지 않았습니다 (그것은 일종의 상자 밖 사고 방식입니다).
Francesco

이것은 확실히 유효한 옵션이며, 조금 생각한 것입니다. 수명이 긴 Lightroom 전용 접근 방식을 선호한다고 생각합니다. Lightroom API는 OS 종속 매크로 솔루션보다 버전에서 버전으로 덜 변경 될 것으로 예상합니다.
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에 넣었 지만 위의 스 니펫은 파일 이름 기반 배치 처리 작업의 기반으로 사용하는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.