Запись действий в Photoshop CS6 и CC в скрипт

Скрипты в Photoshop не только предоставляют возможность автоматизировать повторяющиеся действия, но и позволяют записывать события, производимые в Фотошопе пользователем, в скрипт! Это очень полезно, когда не знаешь, как прописать в программном коде то или иное действие.

Как я указывал в предыдущих материалах этого цикла, скрипты имеют ряд преимуществ перед более простыми в использовании Action, например, с помощью скриптов можно воспроизвести те операции, которые не под силу Action - это создание файлов с возрастающей нумерацией, распознание по ориентации изображения, очень важную для меня операцию - сохранить для Web и многое другое.

Примечание. Для лучшего понимания материала, смотрите видео внизу этой странички.

Для того, чтобы Photoshop записывал свои действия, следует в папку C:\Program Files\Adobe\Adobe Photoshop CS6\Plug-ins или C:\Program Files\Adobe\Adobe Photoshop CS6 (64 Bit)\Plug-ins для 64-х битного Фотошопа поместить файл ScriptListener.8li. В более ранних версиях программы этот файл размещался в директории Files\Adobe\Adobe Photoshop CS5\Scripting\Utilities, а для 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:

Теги:

Помощь сайту

Понравился сайт? Уроки оказались полезными? Вы можете поддержать проект, просто если скачаете и установите приложение "Фонарик" для Андроид. Приложение написал автор сайта и рассчитывает в дальнейшем публиковать свои приложения. Фонарик управляет светодиодом вспышки фотокамеры телефона, а также включает подсветку экраном на полной яркости.

Преимущества: гибкие настройки. Вы можете задать в настройках, чтобы фонарик сразу включался при запуске приложения и автоматическое включение таймера при запуске приложения. Настройки позволяют отключить блокировку экрана и блокировку фонарика кнопкой включения телефона. Также вы можете самостоятельно установить время таймера.

Если приложение наберёт популярность, это даст стимул автору на создание новых приложений с учётом пожеланий посетителей сайта.

Установить с Google Play.

Заранее благодарен, Дмитрий.

QR-код для установки:

Если Вам понравился материал, скажите свое "спасибо", поделитесь ссылками с друзьями в социальных сетях! Спасибо!

Похожие материалы:

изменение размеров части изображения масштабированием "с учетом содержимого"
Все мы сталкиваемся с ситуациями, когда изображение немного меньше, чем то пространство, которое оно должно заполнить. Например, если Вы изменяете...
понимание гистограммы - низкий и высокий ключ изображения
В предыдущем уроке из серии по коррекции тона и цвета в Photoshop, мы узнали, как читать и понимать гистограмму изображения, что является одним из...
Нарисовать пунктирную линию в Photohop довольно легко, если Вы, конечно, знаете как это сделать. Этот урок научит Вас, как создать различные...
массовое обработка фото - уменьшение размера. Условные операции
Ранее я не раз писал про массовую обработку фотографий - например, про пакетное уменьшение размера. В этом материале речь зайдёт так же об пакетном...