Автоматизация Photoshop: скрипты на JavaScript

Photoshop — мощный инструмент для редактирования изображений, и автоматизация значительно ускоряет рутинные задачи. Мы уже рассматривали, как создавать логотипы и исправлять пересветы; следующий шаг — автоматизация. Если вы знакомы с Photoshop Actions, то знаете базовую автоматизацию. Скрипты Photoshop дают больше гибкости: они написаны на JavaScript и позволяют изменять поведение во время выполнения — то, чего Actions не умеют.
Если вы фанат GIMP или не хотите платить за Photoshop, посмотрите наш гид по автоматизации GIMP скриптами (вторичный вариант подхода).
Важно: скрипты Photoshop пишутся в ExtendScript (вариант JavaScript для приложений Adobe). ExtendScript поддерживает диалоговые окна, файловые операции и прямой доступ к объектам документа Photoshop.
Что понадобится
- Установленный Photoshop (любая современная версия; названия версий могут отличаться).
- ExtendScript Toolkit (входит в подписку Creative Cloud) или любой текстовый редактор по вкусу (Sublime Text, VS Code и т. п.).
- Базовые знания JavaScript полезны, но не обязательны.
Кратко: ExtendScript Toolkit удобен тем, что поддерживает точки остановки (breakpoints) и консоль отладки.
Ваш первый скрипт: изменение размера изображений
Откройте ExtendScript Toolkit и убедитесь, что в нем выбран целевой продукт — Adobe Photoshop вашей версии. Интерфейс может выглядеть устаревшим, но он работает.

Скопируйте и вставьте этот код в основное окно редактора (левое):
current_document = app.activeDocument;
new_width = 670;
current_document.resizeImage(
UnitValue(new_width, 'px'),
null,
null,
ResampleMethod.BICUBIC
);Пояснение одной строкой: current_document получает активный документ Photoshop; new_width задаёт желаемую ширину в пикселях; resizeImage меняет размер с указанием метода ресэмплинга.
Ключевые моменты:
- Если Photoshop не запущен или не открыт документ, выражение app.activeDocument вызовет исключение. Исключения останавливают выполнение.
- UnitValue(new_width, ‘px’) переводит значение в единицы, понятные API.
- ResampleMethod — перечисление методов ресэмплинга (см. ниже).
Есть пять основных методов ресэмплинга. Выберите в зависимости от задачи:
- Nearest Neighbor — очень быстро, качество минимальное.
- Bilinear — чуть лучше, но уступает Bicubic.
- Bicubic — хорошее качество, медленнее.
- Bicubic Smoother — улучшенный Bicubic для увеличения изображений.
- Bicubic Sharper — улучшенный Bicubic для уменьшения (downsampling).
Запуск скрипта в ExtendScript Toolkit
- Убедитесь, что Photoshop открыт вместе с документом.
- В верхнем левом раскрывающемся списке “Target” выберите вашу версию Adobe Photoshop (например, “Adobe Photoshop CC 2017” или современную версию).
- Нажмите кнопку “Play” (Выполнить) в правой части панели инструментов.
Если всё прошло успешно, изображение изменит размер. Консоль JavaScript в правой части Toolkit покажет вывод. Если нет вывода — вы увидите “Result: undefined”.

Если возникла ошибка, Toolkit выделит строку (примерно) и покажет оранжевую полосу с сообщением. Остановите выполнение (Stop) и проверьте:
- код на опечатки;
- что Photoshop запущен;
- что открыт документ.
Как запускать скрипты из Photoshop
Сохраните скрипт в файле с расширением .jsx. По умолчанию Toolkit предлагает папку Presets/Scripts в установке Photoshop.
В Photoshop есть несколько способов запустить скрипт:
- Файл > Скрипты > Обзор (File > Scripts > Browse) — выбрать файл и сразу выполнить.
- Разместить .jsx в папке Presets/Scripts и перезапустить Photoshop — скрипт появится в меню Файл > Скрипты.
- Файл > Скрипты > Диспетчер событий скриптов (Script Events Manager) — привязать выполнение скрипта к событию (открытие документа, печать и т.д.).

Диспетчер событий позволяет:
- Выбрать событие Photoshop, при котором будет запускаться скрипт (например, при открытии документа).
- Указать конкретный скрипт.
- В качестве альтернативы — выбрать действие (Action), если не нужен скрипт.
После настройки нажмите “Add” (Добавить) и затем “Done” (Готово).
Если хотите, чтобы скрипт был видим в меню, поместите .jsx в Presets > Scripts и перезапустите Photoshop.

Улучшаем код: не масштабировать вверх и правильно ресэмплировать
Исходный код хорошо работает для простого уменьшения до 670px, но он увеличит мелкие картинки, ухудшая качество. Добавим условие, проверяющее ширину документа:
current_document = app.activeDocument;
new_width = 670;
if(current_document.width > new_width) {
current_document.resizeImage(
UnitValue(new_width, 'px'),
null,
null,
ResampleMethod.BICUBIC
);
}Мы обернули вызов resizeImage в if — теперь маленькие изображения пропускаются.
Добавим финишную обработку: используем Bicubic Sharper при уменьшении и применим авто-контраст и резкость:
current_document = app.activeDocument; // Get the active document
new_width = 670; // new width to ressize to
if(current_document.width > new_width) {
// if document is larger than new size
current_document.resizeImage(
UnitValue(new_width, 'px'),
null,
null,
ResampleMethod.BICUBICSHARPER
);
}
current_document.activeLayer.autoContrast(); // Apply contrast
current_doc.activeLayer.applySharpen(); // Apply SharpenСовет: закомментируйте или отключайте авто-эффекты при пакетной обработке, если позже хотите вручную проверять качество.
Важно: методы автоконтраста и резкости применяются к активному слою. Если у вас слои сложного состава, сначала объедините слой для предсказуемого результата.
Диалог для пользователя: задаём ширину при запуске
Чтобы позволить пользователю вводить значение ширины при запуске, используйте prompt:
current_document = app.activeDocument;
new_width = parseInt(prompt('Введите желаемую ширину в пикселях:', '670'), 10);
if(!isNaN(new_width) && current_document.width > new_width) {
current_document.resizeImage(
UnitValue(new_width, 'px'),
null,
null,
ResampleMethod.BICUBICSHARPER
);
}Примечание: prompt возвращает строку; parseInt превращает её в число. Всегда проверяйте isNaN, чтобы избежать ошибок.
Пакетная обработка папки изображений (пример)
Ниже упрощённый шаблон для обработки всех файлов изображения в выбранной папке (открытие, применение ресайза, сохранение как JPEG):
var inputFolder = Folder.selectDialog('Выберите папку с изображениями');
if(inputFolder != null) {
var files = inputFolder.getFiles(/
\.(jpg|jpeg|png|tif|tiff)$/i);
for(var i = 0; i < files.length; i++) {
var file = files[i];
var doc = app.open(file);
// Применяем изменения, например, уменьшаем до 1200px
var targetWidth = 1200;
if(doc.width > targetWidth) {
doc.resizeImage(UnitValue(targetWidth, 'px'), null, null, ResampleMethod.BICUBICSHARPER);
}
// Сохраняем в подпапку "export"
var exportFolder = new Folder(inputFolder + '/export');
if(!exportFolder.exists) exportFolder.create();
var saveFile = new File(exportFolder + '/' + doc.name.replace(/\.[^\.]+$/, '') + '.jpg');
var jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.quality = 8;
doc.saveAs(saveFile, jpgSaveOptions, true, Extension.LOWERCASE);
doc.close(SaveOptions.DONOTSAVECHANGES);
}
}Этот шаблон показателен: он иллюстрирует выбор папки, перебор файлов, открытие, изменение размера, сохранение и закрытие без сохранения исходного документа.
Важно: в названиях файлов и путях учитывайте кодировку и разрешения; на разных ОС возможны отличия.
Отладка и логирование
- Используйте ExtendScript Toolkit, чтобы ставить точки останова и следить за переменными.
- console.log в ExtendScript Toolkit заменяется выводом в JavaScript Console (Toolkit автоматически показывает result/ошибки).
- Добавляйте try/catch вокруг критических блоков и выводите сообщения через alert() или $.writeln() для логов.
Пример try/catch:
try {
// ваш код
} catch(e) {
alert('Ошибка: ' + e.message);
}Когда скрипты не подходят (контрпримеры)
- Если задачи требуют редакторского решения (тонкая ретушь, художническая правка), автоматизация не заменит ручную работу.
- Если документы сильно различаются по структуре слоёв и масок, универсальный скрипт будет ошибаться.
- Для интерактивной работы с множеством ручных правок лучше использовать Actions + ручную донастройку, а не полностью автоматическую обработку.
Альтернативные подходы
- Actions (Действия): легко записываются, подходят для линейных последовательностей, но не поддерживают логику ветвления и диалоги.
- Droplets: упакованные Actions, исполняемые перетаскиванием файлов на ярлык.
- GIMP + Script-Fu: бесплатная альтернатива; синтаксис и возможности отличаются.
Ментальные модели и хакерская проверка качества
- Сделайте правило «не увеличивать изображение» по умолчанию.
- Для уменьшения используйте Bicubic Sharper.
- Для увеличения — Bicubic Smoother.
- Разделяйте шаги: изменение размера → корректировка контраста → сохранение. Это проще тестировать.
Роли и чек-листы
Для командной работы разделите обязанности:
- Дизайнер: проверяет тестовые результаты на контрольной выборке.
- Разработчик скриптов: пишет и отлаживает код.
- QA: запускает пакетную обработку на тестовой папке и проверяет качества.
Чек-лист перед запуском на проде:
- Резервная копия исходных файлов.
- Тестовая папка с разнообразными изображениями.
- Параметры сохранения (формат, качество) проверены.
- Скрипт работает без исключений на тестовой выборке.
Шаблоны и пресеты (быстрый чек-лист)
- Папка Presets/Scripts — для доступа через меню Photoshop.
- Версия Photoshop — убедитесь, что скрипт совместим с вашей версией API.
- Локализация: в текстовых диалогах используйте язык аудитории.
Критерии приёмки
- Скрипт корректно обрабатывает 95% тестовой выборки без визуальных артефактов.
- Размер выходных изображений соответствует техническому заданию.
- Сохранение проходит без потери метаданных, если это требование проекта.
Модель принятия решений (Mermaid)
flowchart TD
A[Нужно изменить размер?] -->|Да| B{Изображение больше цели?}
A -->|Нет| G[Нет действий]
B -->|Да| C[Уменьшить: Bicubic Sharper]
B -->|Нет| D{Увеличивать?}
D -->|Да| E[Увеличить: Bicubic Smoother]
D -->|Нет| F[Пропустить]
C --> H[Применить авто-контраст/шарп]
E --> H
H --> I[Сохранить]Совместимость и миграция
- Методы и объекты Photoshop Scripting API стабильны, но могут меняться между крупными версиями. Тестируйте скрипты при обновлении Photoshop.
- ExtendScript Toolkit может быть заменён на VS Code с плагинами, но Toolkit даёт встроенную консоль и отладчик.
Безопасность и GDPR (если применимо)
- Скрипты, которые автоматически выгружают изображения на удалённые сервера, должны обрабатывать пользовательские данные в соответствии с политикой конфиденциальности.
- Всегда информируйте пользователей и собирайте согласие, если скрипт передаёт файлы вне локальной сети.
Типичные ошибки и их исправление
- “app.activeDocument undefined”: нет открытого документа или Photoshop не подключён.
- Ошибки при сохранении: проверьте права доступа к папке и корректность путей.
- Неверные имена файлов: учитывайте символы, недопустимые в файловой системе.
Быстрый справочник (cheat sheet)
- Открыть файл: app.open(new File(‘/путь/к/файлу’))
- Получить активный документ: app.activeDocument
- Изменить размер: doc.resizeImage(UnitValue(800, ‘px’), null, null, ResampleMethod.BICUBICSHARPER)
- Сохранить JPEG: doc.saveAs(file, new JPEGSaveOptions(), true, Extension.LOWERCASE)
- Закрыть без сохранения: doc.close(SaveOptions.DONOTSAVECHANGES)
1‑строчный глоссарий
- ExtendScript: вариант JavaScript для приложений Adobe.
- JSX: расширение файла скрипта Photoshop.
- ResampleMethod: метод ресэмплинга при изменении размера.
Что дальше?
Начните с простого скрипта для одного изображения. Протестируйте на 20–50 файлах разного размера и формата. Затем добавляйте функции: выбор целевой ширины, обработка папок, сохранение вариантов (web/print), логирование и обработка ошибок.
Важно: автоматизация — это инструмент для ускорения рутинной работы. Она экономит время, но требует тестирования и контроля качества.
Если вам понравился этот материал — поделитесь своими скриптами и идеями в комментариях. Какие задачи вы хотели бы автоматизировать в первую очередь?
Image Credit: whiteMocca via Shutterstock.com
Похожие материалы
Как посмотреть историю местоположений в Google Maps
Пароль на историю поиска Google — как включить
Исправить битый пиксель на ЖК‑экране
Кастомный ISO Ubuntu с Cubic — шаг за шагом
Как организовать фототеку: ошибки и готовый план