Скрипты в Photoshop не только предоставляют возможность автоматизировать повторяющиеся действия, но и позволяют записывать события, производимые в Фотошопе пользователем, в скрипт! Это очень полезно, когда не знаешь, как прописать в программном коде то или иное действие.
Как я указывал в предыдущих материалах этого цикла, скрипты имеют ряд преимуществ перед более простыми в использовании Action, например, с помощью скриптов можно воспроизвести те операции, которые не под силу Action — это создание файлов с возрастающей нумерацией, распознание по ориентации изображения, очень важную для меня операцию — сохранить для Web и многое другое.
Примечание. Для лучшего понимания материала, смотрите видео внизу этой странички.
Для того, чтобы Photoshop записывал свои действия, следует в папку C:Program FilesAdobeAdobe Photoshop CS6Plug-ins или C:Program FilesAdobeAdobe Photoshop CS6 (64 Bit)Plug-ins для 64-х битного Фотошопа поместить файл ScriptListener.8li. В более ранних версиях программы этот файл размещался в директории FilesAdobeAdobe Photoshop CS5ScriptingUtilities, а для CS6 его придётся скачать на официальном сайте программы или по ссылкам внизу этой страницы.
После добавления файла следует перезапустить программу. После этого произведите любое действие в Photoshop и на Вашем рабочем столе появятся два файла — ScriptingListenerJS.log и ScriptingListenerVB.log. В первом из них события записываются на языке JavaScript, во втором — на Visual Basic Script.
Я пользуюсь JavaScript, поэтому далее буду рассматривать второй вариант.
Итак, перед записью событий откройте файл ScriptingListenerJS.log в любом текстовом редакторе, удалите все имеющиеся в нём записи и сохраните его. Затем произведите нужные действия в Photoshop`е.
Для примера, я произвёл следующие действия, кстати, одно из этих действий — сохранение для Web — невозможно автоматизировать и записать с помощью обычных Action:
- создал новый документ с белым фоном размером 600 на 400 пикселей
- залил его дефолтным основным цветом — чёрным
- сохранил для Web в формате JPG с качеством 50% на рабочем столе
Теперь открываю файл ScriptingListenerJS.log и вижу следующий код:
var idMk = charIDToTypeID ( "Mk " ); var desc11 = new ActionDescriptor (); var idNw = charIDToTypeID ( "Nw " ); var desc12 = new ActionDescriptor (); var idMd = charIDToTypeID ( "Md " ); var idRGBM = charIDToTypeID ( "RGBM" ); desc12.putClass ( idMd, idRGBM ); var idWdth = charIDToTypeID ( "Wdth" ); var idRlt = charIDToTypeID ( "#Rlt" ); desc12.putUnitDouble ( idWdth, idRlt, 600.000000 ); var idHght = charIDToTypeID ( "Hght" ); var idRlt = charIDToTypeID ( "#Rlt" ); desc12.putUnitDouble ( idHght, idRlt, 400.000000 ); var idRslt = charIDToTypeID ( "Rslt" ); var idRsl = charIDToTypeID ( "#Rsl" ); desc12.putUnitDouble ( idRslt, idRsl, 72.000000 ); var idpixelScaleFactor = stringIDToTypeID ( "pixelScaleFactor" ); desc12.putDouble ( idpixelScaleFactor, 1.000000 ); var idFl = charIDToTypeID ( "Fl " ); var idFl = charIDToTypeID ( "Fl " ); var idWht = charIDToTypeID ( "Wht " ); desc12.putEnumerated ( idFl, idFl, idWht ); var idDpth = charIDToTypeID ( "Dpth" ); desc12.putInteger ( idDpth, 8 ); var idprofile = stringIDToTypeID ( "profile" ); desc12.putString ( idprofile, """Adobe RGB (1998)""" ); var idDcmn = charIDToTypeID ( "Dcmn" ); desc11.putObject ( idNw, idDcmn, desc12 ); executeAction ( idMk, desc11, DialogModes.NO ); var idFl = charIDToTypeID ( "Fl " ); var desc13 = new ActionDescriptor (); var idUsng = charIDToTypeID ( "Usng" ); var idFlCn = charIDToTypeID ( "FlCn" ); var idFrgC = charIDToTypeID ( "FrgC" ); desc13.putEnumerated ( idUsng, idFlCn, idFrgC ); var idOpct = charIDToTypeID ( "Opct" ); var idPrc = charIDToTypeID ( "#Prc" ); desc13.putUnitDouble ( idOpct, idPrc, 100.000000 ); var idMd = charIDToTypeID ( "Md " ); var idBlnM = charIDToTypeID ( "BlnM" ); var idNrml = charIDToTypeID ( "Nrml" ); desc13.putEnumerated ( idMd, idBlnM, idNrml ); executeAction ( idFl, desc13, DialogModes.NO ); var idExpr = charIDToTypeID ( "Expr" ); var desc14 = new ActionDescriptor (); var idUsng = charIDToTypeID ( "Usng" ); var desc15 = new ActionDescriptor (); var idOp = charIDToTypeID ( "Op " ); var idSWOp = charIDToTypeID ( "SWOp" ); var idOpSa = charIDToTypeID ( "OpSa" ); desc15.putEnumerated ( idOp, idSWOp, idOpSa ); var idDIDr = charIDToTypeID ( "DIDr" ); desc15.putBoolean ( idDIDr, true ); var idIn = charIDToTypeID ( "In " ); desc15.putPath ( idIn, new File ( "C:\Users\Exellent\Desktop" ) ); var idFmt = charIDToTypeID ( "Fmt " ); var idIRFm = charIDToTypeID ( "IRFm" ); var idJPEG = charIDToTypeID ( "JPEG" ); desc15.putEnumerated ( idFmt, idIRFm, idJPEG ); var idIntr = charIDToTypeID ( "Intr" ); desc15.putBoolean ( idIntr, false ); var idQlty = charIDToTypeID ( "Qlty" ); desc15.putInteger ( idQlty, 50 ); var idQChS = charIDToTypeID ( "QChS" ); desc15.putInteger ( idQChS, 0 ); var idQCUI = charIDToTypeID ( "QCUI" ); desc15.putInteger ( idQCUI, 0 ); var idQChT = charIDToTypeID ( "QChT" ); desc15.putBoolean ( idQChT, false ); var idQChV = charIDToTypeID ( "QChV" ); desc15.putBoolean ( idQChV, false ); var idOptm = charIDToTypeID ( "Optm" ); desc15.putBoolean ( idOptm, true ); var idPass = charIDToTypeID ( "Pass" ); desc15.putInteger ( idPass, 1 ); var idblur = charIDToTypeID ( "blur" ); desc15.putDouble ( idblur, 0.000000 ); var idEICC = charIDToTypeID ( "EICC" ); desc15.putBoolean ( idEICC, false ); var idMtt = charIDToTypeID ( "Mtt " ); desc15.putBoolean ( idMtt, true ); var idMttR = charIDToTypeID ( "MttR" ); desc15.putInteger ( idMttR, 255 ); var idMttG = charIDToTypeID ( "MttG" ); desc15.putInteger ( idMttG, 255 ); var idMttB = charIDToTypeID ( "MttB" ); desc15.putInteger ( idMttB, 255 ); var idSHTM = charIDToTypeID ( "SHTM" ); desc15.putBoolean ( idSHTM, false ); var idSImg = charIDToTypeID ( "SImg" ); desc15.putBoolean ( idSImg, true ); var idSWsl = charIDToTypeID ( "SWsl" ); var idSTsl = charIDToTypeID ( "STsl" ); var idSLAl = charIDToTypeID ( "SLAl" ); desc15.putEnumerated ( idSWsl, idSTsl, idSLAl ); var idSWch = charIDToTypeID ( "SWch" ); var idSTch = charIDToTypeID ( "STch" ); var idCHsR = charIDToTypeID ( "CHsR" ); desc15.putEnumerated ( idSWch, idSTch, idCHsR ); var idSWmd = charIDToTypeID ( "SWmd" ); var idSTmd = charIDToTypeID ( "STmd" ); var idMDCC = charIDToTypeID ( "MDCC" ); desc15.putEnumerated ( idSWmd, idSTmd, idMDCC ); var idohXH = charIDToTypeID ( "ohXH" ); desc15.putBoolean ( idohXH, false ); var idohIC = charIDToTypeID ( "ohIC" ); desc15.putBoolean ( idohIC, true ); var idohAA = charIDToTypeID ( "ohAA" ); desc15.putBoolean ( idohAA, true ); var idohQA = charIDToTypeID ( "ohQA" ); desc15.putBoolean ( idohQA, true ); var idohCA = charIDToTypeID ( "ohCA" ); desc15.putBoolean ( idohCA, false ); var idohIZ = charIDToTypeID ( "ohIZ" ); desc15.putBoolean ( idohIZ, true ); var idohTC = charIDToTypeID ( "ohTC" ); var idSToc = charIDToTypeID ( "SToc" ); var idOCzerothree = charIDToTypeID ( "OC03" ); desc15.putEnumerated ( idohTC, idSToc, idOCzerothree ); var idohAC = charIDToTypeID ( "ohAC" ); var idSToc = charIDToTypeID ( "SToc" ); var idOCzerothree = charIDToTypeID ( "OC03" ); desc15.putEnumerated ( idohAC, idSToc, idOCzerothree ); var idohIn = charIDToTypeID ( "ohIn" ); desc15.putInteger ( idohIn, -1 ); var idohLE = charIDToTypeID ( "ohLE" ); var idSTle = charIDToTypeID ( "STle" ); var idLEzerothree = charIDToTypeID ( "LE03" ); desc15.putEnumerated ( idohLE, idSTle, idLEzerothree ); var idohEn = charIDToTypeID ( "ohEn" ); var idSTen = charIDToTypeID ( "STen" ); var idENzerozero = charIDToTypeID ( "EN00" ); desc15.putEnumerated ( idohEn, idSTen, idENzerozero ); var idolCS = charIDToTypeID ( "olCS" ); desc15.putBoolean ( idolCS, false ); var idolEC = charIDToTypeID ( "olEC" ); var idSTst = charIDToTypeID ( "STst" ); var idSTzerozero = charIDToTypeID ( "ST00" ); desc15.putEnumerated ( idolEC, idSTst, idSTzerozero ); var idolWH = charIDToTypeID ( "olWH" ); var idSTwh = charIDToTypeID ( "STwh" ); var idWHzeroone = charIDToTypeID ( "WH01" ); desc15.putEnumerated ( idolWH, idSTwh, idWHzeroone ); var idolSV = charIDToTypeID ( "olSV" ); var idSTsp = charIDToTypeID ( "STsp" ); var idSPzerofour = charIDToTypeID ( "SP04" ); desc15.putEnumerated ( idolSV, idSTsp, idSPzerofour ); var idolSH = charIDToTypeID ( "olSH" ); var idSTsp = charIDToTypeID ( "STsp" ); var idSPzerofour = charIDToTypeID ( "SP04" ); desc15.putEnumerated ( idolSH, idSTsp, idSPzerofour ); var idolNC = charIDToTypeID ( "olNC" ); var list1 = new ActionList (); var desc16 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCzerozero = charIDToTypeID ( "NC00" ); desc16.putEnumerated ( idncTp, idSTnc, idNCzerozero ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc16 ); var desc17 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNConenine = charIDToTypeID ( "NC19" ); desc17.putEnumerated ( idncTp, idSTnc, idNConenine ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc17 ); var desc18 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwoeight = charIDToTypeID ( "NC28" ); desc18.putEnumerated ( idncTp, idSTnc, idNCtwoeight ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc18 ); var desc19 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc19.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc19 ); var desc20 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc20.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc20 ); var desc21 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc21.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list1.putObject ( idSCnc, desc21 ); desc15.putList ( idolNC, list1 ); var idobIA = charIDToTypeID ( "obIA" ); desc15.putBoolean ( idobIA, false ); var idobIP = charIDToTypeID ( "obIP" ); desc15.putString ( idobIP, """""" ); var idobCS = charIDToTypeID ( "obCS" ); var idSTcs = charIDToTypeID ( "STcs" ); var idCSzeroone = charIDToTypeID ( "CS01" ); desc15.putEnumerated ( idobCS, idSTcs, idCSzeroone ); var idovNC = charIDToTypeID ( "ovNC" ); var list2 = new ActionList (); var desc22 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCzeroone = charIDToTypeID ( "NC01" ); desc22.putEnumerated ( idncTp, idSTnc, idNCzeroone ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc22 ); var desc23 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwozero = charIDToTypeID ( "NC20" ); desc23.putEnumerated ( idncTp, idSTnc, idNCtwozero ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc23 ); var desc24 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCzerotwo = charIDToTypeID ( "NC02" ); desc24.putEnumerated ( idncTp, idSTnc, idNCzerotwo ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc24 ); var desc25 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNConenine = charIDToTypeID ( "NC19" ); desc25.putEnumerated ( idncTp, idSTnc, idNConenine ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc25 ); var desc26 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCzerosix = charIDToTypeID ( "NC06" ); desc26.putEnumerated ( idncTp, idSTnc, idNCzerosix ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc26 ); var desc27 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc27.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc27 ); var desc28 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc28.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc28 ); var desc29 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwofour = charIDToTypeID ( "NC24" ); desc29.putEnumerated ( idncTp, idSTnc, idNCtwofour ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc29 ); var desc30 = new ActionDescriptor (); var idncTp = charIDToTypeID ( "ncTp" ); var idSTnc = charIDToTypeID ( "STnc" ); var idNCtwotwo = charIDToTypeID ( "NC22" ); desc30.putEnumerated ( idncTp, idSTnc, idNCtwotwo ); var idSCnc = charIDToTypeID ( "SCnc" ); list2.putObject ( idSCnc, desc30 ); desc15.putList ( idovNC, list2 ); var idovCM = charIDToTypeID ( "ovCM" ); desc15.putBoolean ( idovCM, false ); var idovCW = charIDToTypeID ( "ovCW" ); desc15.putBoolean ( idovCW, true ); var idovCU = charIDToTypeID ( "ovCU" ); desc15.putBoolean ( idovCU, true ); var idovSF = charIDToTypeID ( "ovSF" ); desc15.putBoolean ( idovSF, true ); var idovCB = charIDToTypeID ( "ovCB" ); desc15.putBoolean ( idovCB, true ); var idovSN = charIDToTypeID ( "ovSN" ); desc15.putString ( idovSN, """images""" ); var idSaveForWeb = stringIDToTypeID ( "SaveForWeb" ); desc14.putObject ( idUsng, idSaveForWeb, desc15 ); executeAction ( idExpr, desc14, DialogModes.NO );
Теперь давайте убедимся, что в коде содержатся именно те действия, которые я совершил.
Для этого можно скопировать код, сохранить его в файле с расширением jsx, затем просто мышкой перетащить этот файл в рабочее окно Фотошопа.
Либо открыть редактор Adobe ExtendScript Toolkit CS6, инсталлирующийся при установке Photoshop CS6, выбрать в левом верхнем углу «Adobe Photoshop CS6», затем нажать на кнопку «Start running the script» (зелёный треугольник).
Примечание. В Photoshop CC бесплатное приложение ExtendScript Toolkit CC надо скачать через Adobe Creative Cloud.
В любом случае, Фотошоп воспроизведёт действия, которые я только что записал.
Смотрите видео по материалам статьи:
Скачать файлы ScriptListener.8li для Photocsop CS6 и CC для Win32 и win64:
Скачать с Github