Phát triển plugin Lightroom - có đáng không?


28

Gần đây tôi đã nâng cấp quy trình quản lý và tổ chức ảnh của mình từ "không có gì" lên Lightroom 4, và mặc dù tôi rất hài lòng với phần mềm, một tính năng mà nó cực kỳ thiếu là khả năng ghi lại bất kỳ loại macro hoặc tập lệnh nào để tự động hóa các nhiệm vụ lặp đi lặp lại - trong quá trình tôi di chuyển vào lightroom, đã có rất nhiều nhiệm vụ lặp đi lặp lại mà tôi muốn thực hiện và tôi tự hỏi liệu có đáng để học cách viết các plugin LR để thực hiện một số nhiệm vụ này không. Để cho bạn ví dụ về các loại điều mà tôi muốn tự động hóa:

  • Trong một nhóm lớn các ảnh RAW + PSD + JPG được xếp chồng lên nhau, chọn tệp trong mỗi ngăn xếp với phần mở rộng JPG và đặt nó lên trên cùng của ngăn xếp
  • Thực hiện sao chép siêu dữ liệu hàng loạt từ tệp RAW (hiện tại) sang tệp JPEG (hiện tại)

Tôi có thể thấy rất nhiều cách khác mà các kịch bản có thể giúp việc quản lý hình ảnh trong Lightroom trở nên dễ dàng hơn bây giờ. Câu hỏi của tôi sau đó có ba phần:

1) Việc viết các plugin Lightroom khó như thế nào? Tôi thành thạo một số ngôn ngữ lập trình (C / C ++, Python, Perl), nhưng tôi chưa làm gì với Lua. API Lightroom có ​​dễ dàng kết nối và có yêu cầu bất kỳ công cụ chuyên dụng nào để phát triển không?

2) Tôi có thể viết các kịch bản để thực hiện các loại nhiệm vụ tôi mô tả ở trên một cách dễ dàng không?

3) Có tài nguyên hay hướng dẫn tốt nào mà tôi có thể đọc để bắt đầu phát triển plugin Lightroom không?


Tôi không thể cân nhắc về việc phát triển plugin - chưa thực sự quan tâm đến nó - nhưng có vẻ như việc sử dụng của bạn đặc biệt nhất đối với ai đó đi từ không có quy trình làm việc đến Lightroom. Đó là, một khi bạn bắt đầu sử dụng LR, bạn sẽ không bao giờ có nhu cầu sao chép meta từ RAW sang .jpg hoặc .sheet, vì đó là tất cả những gì về quy trình công việc.
Dan Wolfgang

Đó là sự thật, các ví dụ tôi đưa ra (về mặt lý thuyết) sẽ không bao giờ cần phải làm lại một lần nữa khi tôi thực hiện xong lần nhập đầu tiên. Tuy nhiên, có lẽ đó là trường hợp có những nhiệm vụ khác mà tôi muốn có thể tự động hóa trong tương lai? Tôi không chắc về số này. Nhưng nếu nó đủ dễ để phát triển các plugin, thì việc học bây giờ sẽ không làm tôi tổn thương và có thể có ích trong tương lai. Nếu việc phát triển plugin phức tạp, thì tôi không muốn làm phiền và sẽ tin rằng Lightroom sẽ làm hầu hết những gì tôi cần sau khi thư viện của tôi được xây dựng.
David

Ồ, vâng, các tùy chọn tự động hóa và kết nối là vô hạn. Tôi chỉ chỉ ra điều đó bởi vì, tùy thuộc vào quy mô thư viện của bạn, nó có thể không đáng để nỗ lực (ít nhất, đối với tôi nó không như vậy).
Dan Wolfgang

Mặc dù tôi không biết cách nào để thực hiện việc này bằng Lightroom, nhưng bạn thực sự có thể xây dựng một chương trình để thay đổi dữ liệu EXIF ​​cho tất cả các bức ảnh của bạn. Vui lòng kiểm tra archive.msdn.microsoft.com/changexifwithcsharpstackoverflow.com/questions/58649/ Và và stackoverflow.com/questions/226973/how-to-edit-exif-data-in-net . Bạn đã đề cập rằng bạn biết C ++, tôi tin rằng bạn có thể tham gia vào C #
K ''

+1, vì câu hỏi này đã cho tôi ý tưởng để xem sdk Lua này :-)
Francesco

Câu trả lời:


39

Tôi chưa làm gì với Lua

Lua có lẽ là ngôn ngữ lập trình đơn giản nhất, sạch nhất mà tôi biết. (Và tôi biết một vài .)

Sự đơn giản của Lua cũng là điểm yếu lớn nhất của nó: là một ngôn ngữ nhỏ, gọn gàng theo thiết kế, nó không có nhiều thứ được tích hợp trong đó mà bạn mong muốn tìm thấy khi đến từ một ngôn ngữ cấp công nghiệp như Java hoặc pin ngôn ngữ bao gồm như Python.

Lua được thiết kế để được mở rộng bằng C, trong trường hợp này có nghĩa là SDK của Lightroom. Thật tuyệt nếu Adobe đã hoàn thành công việc để cung cấp các công cụ bạn cần không có trong Lua, nhưng thỉnh thoảng bạn có thể sẽ thấy mình gọi ra các công cụ bên ngoài để hoàn thành công việc.

API Lightroom có ​​dễ dàng kết nối không

Phần khó khăn duy nhất về nó là bạn cần cấu trúc mã nguồn theo một cách cụ thể và cung cấp một Info.luatệp đặc biệt để nói với Lightroom về plugin của bạn. Tất cả đều được giải thích trong các tài liệu SDK . SDK bao gồm một số plugin hoạt động để bắt đầu, bao gồm một plugin "hello world" khá phức tạp có thể được quét để lấy mã bắt đầu hữu ích.

nó có yêu cầu bất kỳ công cụ chuyên dụng để phát triển không?

Bạn có thể nhận được chỉ bằng một trình soạn thảo văn bản.

Không có tiện ích gỡ lỗi được tích hợp trong Lightroom, nhưng có một cơ sở ghi nhật ký gỡ lỗi trong SDK. Bạn có thể bắt những tin nhắn này trong WinDbgWindows hoặc Consoletrên OS X.

Một phát triển gần đây là mã nguồn mở ZeroBrane Studio Lua IDE. Bạn có thể sử dụng cái này thay vì một trình soạn thảo văn bản khác, nhưng điều thực sự thú vị là có thể đính kèm nó vào plugin đang chạy của bạn , cho phép bạn gỡ lỗi khi nó chạy. Tôi đã thử điều này và nó giúp giảm thời gian chu kỳ sửa lỗi / tải lại / khởi động lại.

Tôi có thể viết các kịch bản để thực hiện các loại nhiệm vụ tôi mô tả ở trên một cách dễ dàng không?

Tôi không nghĩ một trong hai nhiệm vụ là 100% có thể thực hiện được khi chỉ sử dụng SDK Lightroom, nhưng nó có thể thực hiện rất nhiều công việc cho bạn.

chọn tệp trong mỗi ngăn xếp với phần mở rộng JPG và đặt nó lên trên cùng của ngăn xếp

Đây là một số mã giống như Lua mơ hồ để giúp bạn gần như hoàn thành:

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

Thật không may, tôi không thấy một cách nào trong SDK để thực hiện hành động của dòng bình luận cuối cùng đó, kể từ LR 5. Điều tốt nhất tôi có thể nghĩ ra là gọi catalog:setSelectedPhotos(peer), sau đó để nó cho người dùng thực sự nhấp vào huy hiệu số để sắp xếp lại ngăn xếp.

Thực hiện sao chép siêu dữ liệu hàng loạt từ tệp RAW (hiện tại) sang tệp JPEG (hiện tại)

Bạn có thể thực hiện một số điều này với SDK hiện có, nhưng có những hạn chế.

Ví dụ: trong khi bạn có thể đọc giá trị của trường EXIF dateTimeOriginal, không có cơ sở nào trong chính SDK để đặt giá trị. Tôi cho rằng điều này là do các nhà phát triển Lightroom quyết định điều này không bao giờ được thay đổi theo chương trình, đó là thông tin quý giá từ máy ảnh. (Tại sao đó là trường hợp khi có một siêu dữ liệu> Chỉnh sửa thời gian chụp ... mục menu tôi không biết, nhưng bạn có nó.)

Nhưng, bất cứ khi nào SDK cố gắng gài bẫy bạn với một trong những hạn chế này, thường có một lối thoát. Bạn có thể cài đặt ExifTool và gọi nó từ Lua, ví dụ. Đó không phải là một giải pháp hoàn hảo, vì sau đó bạn có sự không nhất quán giữa siêu dữ liệu danh mục và siêu dữ liệu ảnh, nhưng Lightroom sẽ chú ý và đặt huy hiệu lên ảnh, khi nhấp vào sẽ cho phép bạn giải quyết xung đột bằng cách tải lại siêu dữ liệu từ ảnh.

(Bạn sẽ muốn có tùy chọn "Tự động ghi thay đổi vào XMP" trong hộp thoại Cài đặt danh mục khi sử dụng plugin như vậy. Nếu không, bạn sẽ dễ dàng tạo xung đột hai chiều, trong đó cả siêu dữ liệu ảnh danh mục đều có đã thay đổi. Lightroom không biết cách hợp nhất hai bộ siêu dữ liệu, nó khiến bạn chọn một bộ và ghi đè lên bản sao siêu dữ liệu khác với nó.)


Các hạn chế của SDK thực sự đáng kể, các hành động duy nhất được hỗ trợ chính thức, theo hướng dẫn này là thêm xuất khẩu hoặc xuất bản đích, áp dụng xử lý hậu kỳ bổ sung khi xuất hoặc thêm các trường siêu dữ liệu tùy chỉnh. Bất kỳ hành động nào yêu cầu cập nhật bất kỳ cài đặt / giá trị nào, như câu trả lời mô tả, có khả năng được hỗ trợ ngay cho đến khi bạn thử và đặt giá trị cập nhật.
Steven Cickyham

1
@StevenCastyham: Hướng dẫn đó là một tài liệu hướng dẫn; nó không có nghĩa là liệt kê toàn diện tất cả những điều bạn có thể làm với SDK. Ngoài hướng dẫn của lập trình viên đó, SDK cũng bao gồm một tham chiếu HTML. Có khá nhiều điều Adobe đã ghi lại trong tài liệu tham khảo mà họ không trình bày trong hướng dẫn của lập trình viên PDF mà bạn chỉ đến. Xem LrPhoto:setRawMetadata()phần, ví dụ.
Warren Young

1
Câu trả lời hay - +1.
D. Lambert

4

Tôi không biết Lightroom (chưa - có nhưng chưa cài đặt nó), nhưng tùy thuộc vào mức độ phức tạp của những gì bạn đang cố gắng, bạn có thể muốn xem một công cụ macro / tự động hóa bàn phím toàn hệ thống như AutoHotKey . Nó cho phép bạn ghi lại hoặc lập trình bất kỳ chuỗi phím nào mà bạn có thể tìm ra và sau đó, khi bạn nhấn một phím nóng, nó sẽ phát lại chúng vào chương trình của bạn (chẳng hạn như LightRoom) để - theo như chương trình có liên quan - có vẻ như như bạn đã gõ nó Điều này cho phép bạn tự động hóa tất cả các loại mà không cần phải sửa đổi chương trình ứng dụng của bạn.


Chắc chắn một plugin sẽ cung cấp giải pháp tự động hạt mịn hơn, đây là một loại tỷ lệ cực đoan và phụ thuộc vào hệ điều hành. Tôi giả sử các plugin là (ít nhiều) có thể di động giữa Windows và OSX.
Francesco

1
@Francesco - Tôi chắc chắn rằng bạn đúng, nhưng có lẽ bạn cần nhiều kỹ năng lập trình hơn và kiến ​​thức về API LightRoom (hoặc bất cứ điều gì họ gọi là giao diện cho các nhà văn vĩ mô) để đi theo con đường đó. Mặc dù một số lượng khá lớn mọi người thực hiện multiboot hoặc sử dụng vms, hầu hết mọi người có thể dính vào một HĐH và có các bộ xử lý macro tương tự cho Linux, Windows và OSX. Phần khó là có được chuỗi hành động đúng. Đối với hầu hết mọi thứ đơn giản , việc mã hóa lại từ bộ xử lý macro này sang bộ xử lý macro khác không phải là rất khó.
Joe

Tôi thấy quan điểm của bạn nhưng theo ý kiến ​​của tôi, nó hơi ngoài phạm vi với câu hỏi ban đầu (OP rất thành thạo một loạt ngôn ngữ, không phải là Lua). Trong mọi trường hợp, tôi không nghĩ rằng câu trả lời của bạn đáng bị đánh giá thấp vì nó cung cấp một giải pháp khả thi cho vấn đề hiện tại (đó là một cách tiếp cận có suy nghĩ, tôi nói).
Francesco

Đây chắc chắn là một lựa chọn hợp lệ, và một vài điều tôi đã nghĩ về một chút. Tôi nghĩ rằng tôi thích cách tiếp cận dành riêng cho Lightroom, dường như có tuổi thọ cao hơn - tôi dự đoán rằng API Lightroom sẽ thay đổi ít hơn từ phiên bản này sang phiên bản khác so với giải pháp macro phụ thuộc vào hệ điều hành.
David

2

Tôi chỉ muốn xem cách xử lý hàng loạt dựa trên tên tệp trong Lightroom và vì một lý do nào đó, nó trông giống như cách dễ nhất để làm điều đó là thông qua API. Dựa trên bài đăng của @ Warren, tôi đã quản lý để tạo vòng lặp bên trong này cho một nút trên biểu mẫu, nơi tôi cũng có thể đặt trường văn bản để ghi nhật ký ( logs_field) và một số giá trị đầu vào (như trường văn bản để bao gồm tên tệp filenames_fieldvà một số tham số bổ sung cho lô chế biến trong 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
 }

Đoạn này sẽ đi qua một số mẫu tên tập tin, và áp dụng một nhãn cho tất cả các hình ảnh (bạn có thể muốn thay thế getAllPhotosvới getMultipleSelectedOrAllPhotostrong trường hợp bạn chỉ cần chạy nó trên một số hình ảnh của bạn) phù hợp với những mô hình. Tôi đã phải làm điều này vì tôi đã gắn thẻ các bức ảnh bên ngoài Lightroom nhưng cần một cách dễ dàng để di chuyển các thẻ đó vào LR cũng dựa trên tên tệp.

Tôi cũng đưa toàn bộ dự án lên github , nhưng đoạn mã trên sẽ ổn để sử dụng làm cơ sở cho các tác vụ xử lý hàng loạt dựa trên tên tệp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.