การพัฒนาปลั๊กอิน 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 เช่นเนื่องจากเป็นสิ่งที่เวิร์กโฟลว์เกี่ยวข้อง
Dan Wolfgang

นั่นเป็นความจริงตัวอย่างที่ฉันให้ (ในทางทฤษฎี) จะไม่ต้องทำอีกเมื่อฉันทำการนำเข้าครั้งแรก อย่างไรก็ตามอาจเป็นกรณีที่มีงานอื่นที่ฉันอยากจะทำให้เป็นอัตโนมัติในอนาคต ฉันไม่แน่ใจในจำนวนนี้ แต่ถ้ามันง่ายพอที่จะพัฒนาปลั๊กอินการเรียนรู้ตอนนี้จะไม่ทำร้ายฉันและอาจเป็นประโยชน์ในอนาคต หากการพัฒนาปลั๊กอินมีความซับซ้อนฉันไม่ต้องการรบกวนและเชื่อมั่นว่า Lightroom จะทำสิ่งที่ฉันต้องการมากที่สุดเมื่อสร้างห้องสมุดของฉัน
เดวิด

โอ้ใช่แล้วตัวเลือกการเชื่อมต่ออัตโนมัติและการเชื่อมต่อนั้นไม่มีที่สิ้นสุด ฉันเพิ่งจะชี้ให้เห็นเพราะขึ้นอยู่กับขนาดของห้องสมุดของคุณมันอาจไม่คุ้มค่ากับความพยายาม (อย่างน้อยสำหรับฉันมันไม่ได้)
Dan Wolfgang

ในขณะที่ฉันไม่ทราบวิธีการใช้ 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 ก็เป็นจุดอ่อนที่ใหญ่ที่สุด: ด้วยขนาดที่เล็กภาษาสะอาดโดยการออกแบบมันไม่มีอะไรมากมายในตัวที่คุณคาดหวังว่าจะพบเมื่อมาจากภาษาระดับอุตสาหกรรมเช่น Java หรือแบตเตอรี่ ภาษาที่รวมเช่น Python

Lua ได้รับการออกแบบให้ขยายโดย C ซึ่งในกรณีนี้หมายถึง SDK ของ Lightroom เป็นเรื่องที่ยอดเยี่ยมถ้า Adobe ทำงานให้เครื่องมือที่คุณไม่ได้สร้างไว้ใน Lua แต่ตอนนี้คุณอาจจะพบว่าตัวเองกำลังเรียกใช้เครื่องมือภายนอกเพื่อทำสิ่งต่างๆให้เสร็จ

Lightroom API ง่ายต่อการติดตั้งหรือไม่

ส่วนที่ยุ่งยากเพียงอย่างเดียวคือคุณต้องจัดโครงสร้างซอร์สโค้ดด้วยวิธีเฉพาะและจัดเตรียมInfo.luaไฟล์พิเศษเพื่อบอก Lightroom เกี่ยวกับปลั๊กอินของคุณ มันคือทั้งหมดที่อธิบายในเอกสาร SDK ได้ SDK ประกอบด้วยปลั๊กอินที่ใช้งานได้หลากหลายตั้งแต่เริ่มต้นรวมถึงปลั๊กอิน "สวัสดีโลก" ที่ค่อนข้างละเอียดซึ่งสามารถนำไปใช้เป็นรหัสเริ่มต้นที่มีประโยชน์ได้

มันต้องการเครื่องมือพิเศษใด ๆ สำหรับการพัฒนาหรือไม่?

คุณสามารถทำได้ด้วยโปรแกรมแก้ไขข้อความ

ไม่มีตัวช่วยการดีบักที่สร้างไว้ใน Lightroom แต่มีตัวช่วยการบันทึกข้อบกพร่องใน SDK คุณสามารถจับข้อความเหล่านี้ได้ทั้งWinDbgใน Windows หรือConsoleบน OS 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

น่าเสียดายที่ฉันไม่เห็นวิธีใดใน SDK ที่จะดำเนินการกับบรรทัดความคิดเห็นด้านในสุดตั้งแต่ LR 5 เป็นอย่างน้อย สิ่งที่ดีที่สุดที่ฉันสามารถทำได้คือโทรcatalog:setSelectedPhotos(peer)ออกแล้วปล่อยให้ผู้ใช้คลิกที่ป้ายหมายเลขเพื่อเรียงสแต็คใหม่

ดำเนินการคัดลอกข้อมูลเมตาจำนวนมากจากไฟล์ RAW (ปัจจุบัน) ไปยังไฟล์ JPEG (ปัจจุบัน)

คุณสามารถทำสิ่งนี้กับ SDK ที่มีอยู่ แต่มีข้อ จำกัด

ตัวอย่างเช่นในขณะที่คุณสามารถอ่านค่าของdateTimeOriginalเขตข้อมูลEXIF ได้จะไม่มีระบบอำนวยความสะดวกใน SDK สำหรับตั้งค่า ฉันถือว่านี่เป็นเพราะนักพัฒนา Lightroom ตัดสินใจว่าไม่ควรเปลี่ยนโปรแกรมโดยเป็นข้อมูลที่มีค่าจากกล้อง (ทำไมเป็นเช่นนั้นเมื่อมีรายการเมตาดาต้า> แก้ไขเวลาในการจับภาพ ... ที่ฉันไม่รู้ แต่มีอยู่ที่นั่น)

แต่เมื่อใดก็ตามที่ SDK พยายามดักจับคุณด้วยข้อ จำกัด ข้อใดข้อหนึ่งเหล่านี้มักจะมีช่องทางหนี คุณสามารถติดตั้งExifToolและโทรออกจาก Lua ตัวอย่างเช่น นั่นไม่ใช่โซลูชันที่สมบูรณ์แบบเพราะคุณมีความไม่สอดคล้องกันระหว่างแค็ตตาล็อกเมตาดาต้าและเมตาดาต้าของภาพถ่าย แต่ Lightroom จะสังเกตเห็นและวางตราไว้บนภาพถ่ายซึ่งเมื่อคลิกแล้วจะช่วยให้คุณแก้ไขข้อขัดแย้งได้ด้วยการโหลดเมทาดาทาใหม่จากภาพถ่าย

(คุณจะต้องการให้มี "การเปลี่ยนแปลงการเขียนโดยอัตโนมัติใน XMP" ชุดตัวเลือกในกล่องโต้ตอบการตั้งค่าแคตตาล็อกเมื่อใช้ปลั๊กอินดังกล่าว. มิฉะนั้นคุณจะทำให้มันง่ายต่อการสร้างความขัดแย้งสองทางที่ทั้งแคตตาล็อกและโฟโต้เมตาดาต้ามี การเปลี่ยนแปลง Lightroom ไม่รู้ว่าจะรวมเมทาดาทาสองชุดเข้าด้วยกันอย่างไรทำให้คุณเลือกหนึ่งชุดและจะเขียนทับสำเนาข้อมูลเมตาอื่น ๆ ด้วย)


ข้อ จำกัด ของ SDK นั้นมีนัยสำคัญจริง ๆ แล้วการกระทำเพียงอย่างเดียวที่ได้รับการสนับสนุนอย่างเป็นทางการตามคำแนะนำนี้คือการเพิ่มการส่งออกหรือเผยแพร่ปลายทางการใช้การประมวลผลเพิ่มเติมภายหลังเมื่อมีการส่งออก การดำเนินการใด ๆ ที่ต้องมีการอัปเดตการตั้งค่า / ค่าใด ๆ ตามที่อธิบายไว้อาจได้รับการสนับสนุนจนกว่าคุณจะลองและตั้งค่าที่อัปเดต
Steven Cunningham

1
@StevenCunningham: คู่มือนั้นเป็นเอกสารการสอน ไม่ได้มีไว้สำหรับแสดงรายการทุกสิ่งที่คุณสามารถทำได้กับ SDK อย่างครอบคลุม นอกเหนือจากคู่มือของโปรแกรมเมอร์แล้ว SDK ยังมีการอ้างอิง HTML มีบางสิ่งที่ Adobe บันทึกไว้ในเอกสารอ้างอิงที่ไม่ครอบคลุมในคู่มือโปรแกรมเมอร์ของ PDF ที่คุณชี้ไป ดูLrPhoto:setRawMetadata()ตัวอย่างเช่น
Warren Young

1
คำตอบที่ดี - +1
D. Lambert

4

ฉันไม่รู้จัก Lightroom (ยัง - มี แต่ยังไม่ได้ติดตั้ง) แต่ขึ้นอยู่กับความซับซ้อนของสิ่งที่คุณกำลังพยายามทำคุณอาจต้องการดูแมโคร / ระบบอัตโนมัติของคีย์บอร์ดแบบกว้างเช่น AutoHotKey . มันช่วยให้คุณสามารถบันทึกหรือโปรแกรมลำดับการกดแป้นใด ๆ ที่คุณสามารถคิดออกแล้วเมื่อคุณกดปุ่มลัดมันจะเล่นกลับเข้าไปในโปรแกรมของคุณ (เช่น LightRoom) เพื่อให้ - เท่าที่โปรแกรมนั้นเกี่ยวข้อง - ดู เหมือนที่คุณพิมพ์ สิ่งนี้ช่วยให้คุณสามารถทำสิ่งต่าง ๆ ได้โดยอัตโนมัติโดยไม่ต้องดัดแปลงโปรแกรมแอปพลิเคชันของคุณเลย


แน่นอนว่าปลั๊กอินจะให้โซลูชันอัตโนมัติที่ละเอียดยิ่งขึ้นนี่เป็นอัตราส่วนที่สูงมากและขึ้นอยู่กับระบบปฏิบัติการ ฉันคิดว่าปลั๊กอินเป็นแบบพกพา (มากกว่าหรือน้อยกว่า) ระหว่าง Windows และ OSX
ฟรานเชสโก

1
@ ฟรานเชสโก - ฉันแน่ใจว่าคุณพูดถูก แต่คุณอาจต้องการทักษะการเขียนโปรแกรมเพิ่มเติมและความรู้เกี่ยวกับ LightRoom API (หรือสิ่งที่พวกเขาเรียกอินเทอร์เฟซสำหรับตัวเขียนแมโคร) เพื่อไปยังเส้นทางนั้น แม้ว่าผู้คนจำนวนมากใช้ multiboot หรือใช้ vms แต่คนส่วนใหญ่อาจใช้ระบบปฏิบัติการเดียวและมีตัวประมวลผลแมโครที่คล้ายคลึงกันสำหรับ Linux, Windows และ OSX ส่วนที่ยากคือการได้รับลำดับของการกระทำที่ถูกต้อง สำหรับสิ่งที่ง่ายที่สุดการบันทึกจากตัวประมวลผลแมโครตัวหนึ่งไปอีกตัวนั้นไม่ยากมาก
โจ

ฉันเห็นประเด็นของคุณ แต่ในความเห็นของฉันมันค่อนข้างเกินขอบเขตที่กำหนดไว้สำหรับคำถามเดิม (OP มีความเชี่ยวชาญในภาษาต่างๆไม่ใช่ Lua) ไม่ว่าในกรณีใดฉันไม่คิดว่าคำตอบของคุณควรถูกลดระดับลงเนื่องจากเป็นวิธีแก้ปัญหาที่เป็นไปได้ (เป็นวิธีคิดแบบคิดนอกกรอบฉันจะพูด)
ฟรานเชสโก

นี่เป็นตัวเลือกที่ถูกต้องและสิ่งที่ฉันคิดเกี่ยวกับเล็กน้อย ฉันคิดว่าฉันต้องการวิธีการเฉพาะของ Lightroom ซึ่งดูเหมือนว่าจะมีอายุการใช้งานที่ดีขึ้นฉันคาดว่า Lightroom API จะเปลี่ยนจากเวอร์ชันเป็นเวอร์ชันน้อยกว่าโซลูชันแมโครที่ขึ้นกับระบบปฏิบัติการ
เดวิด

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
 }

ตัวอย่างนี้จะผ่านรูปแบบชื่อไฟล์บางส่วนและใช้ป้ายกำกับกับรูปภาพทั้งหมด (คุณอาจต้องการแทนที่getAllPhotosด้วยgetMultipleSelectedOrAllPhotosในกรณีที่คุณจำเป็นต้องเรียกใช้บนรูปภาพบางรูปเท่านั้น) ที่ตรงกับรูปแบบเหล่านั้น ฉันต้องทำเช่นนี้เพราะฉันได้ติดแท็กภาพถ่ายด้านนอกของ Lightroom แล้ว แต่ต้องการวิธีง่ายๆในการย้ายแท็กเหล่านั้นไปยัง LR ด้วยชื่อไฟล์

ฉันวางโครงการทั้งหมดเช่นกันบน githubแต่ข้อมูลข้างต้นควรใช้เป็นฐานสำหรับงานการประมวลผลตามชื่อไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.