Скрипты в PhotoShop

Скрипты в PhotoShop

В фотошопе есть возможность писать скрипты на JavaScript. О базовых возможностях скриптов пойдет речь в этой статье. Для понимания данной статьи необходимо иметь базовые знания о программирование, как минимум работа с объектами, массивами и т.п. Найти информацию по написанию скриптов в интернете достаточно сложно, однако это и не надо, все самое необходимое поставляется прямо с фотошопом. В папке фотошопа можно найти документацию \Scripting\Documents\Photoshop CS5 JavaScript Ref.pdf, а так же набор примеров Scripting\Sample Scripts\JavaScript\, которые подойдут на все случаи жизни.

Документация представляет собой описание объектов в фотошопе, со всеми свойствами и методами, содержит удобное содержание в начале и глоссарий в конце. В документации содержится множество примеров, что значительно облегчает написание скриптов.

Скрипт можно писать прямо в блокноте и сохранять в формате jsx и запускается из фотошопа через меню File/Scripts/browse… после выбора файла скрипт запускается на выполнение.

При написании скриптов постоянно будут возникать ошибки, для вывода отладочной информации можно использовать alert(‘текст сообщения’). В этой статье я постараюсь рассказать об основе работы со слоями, текстом и выделением.

Итак, приступим. Задачу будем решать такую: есть изображение, выбираем пипеткой определенную область и запускаем скрипт. Скрипт выведет в это место текст с расшифровкой цвета в виде R=10 G=20 B=30.

Из JavaScript выглядит как объект app (это аппликация фотошопа). Каждое открытое изображение это объект типа Document. Документ, в свою очередь, содержит такие свойства, как слои, выделения и т.п. Так как для нашей задачи работа будет вестись только с одним изображением мы можем использовать свойство activeDocument для доступа к открытому документу.

Скрипт будет запускаться в тот момент, когда на изображении установлена точка Color Sampler Tool. Нам надо определить координаты этой точки и цвет. Доступ к Color Sampler Tool можно получить через свойство colorSamplers документа. colorSamplers это массив 4-х точек, нам нужна первая точка, выберем ее по индексу:

var colorSamplerRef = app.activeDocument.colorSamplers[0];

Получить координаты точки просто, у есть colorSampler есть свойство position, которое возвращает координаты в виде массива position[0] это координата по X position[1] по Y.

С цветом чуть сложнее т.к. свойство color возвращает объект типа SolidColor.

SolidColor может возвращать цвет в различных цветовых пространствах. Для этого есть свойства cmyk, lab, rgb и т.д. меня интересует свойство rgb, оно предоставляет доступ к составляющим цвета (свойства red, green, blue) возвращаемое значение – число с плавающей точкой, поэтому округлим его функцией round.

var cl = colorSamplerRef.color.rgb;
txt = «R=» + Math.Round(cl.red) + » G=»+ Math.Round(cl.green) +» B= «+ Math.Round(cl.blue);

С координатами и цветом разобрались, теперь осталось только создать новый слой и вывести туда эти данные. Для работы со слоями предусмотрен объект artLayers являющийся свойством документа. В нем есть различные методы, от создания нового слоя, до выполнения фильтров на этом слое.

Добавим новый слой, воспользовавшись методом add()

var layerRef = docRef.artLayers.add();

для вывода работы с текстом есть объект textItem однако с текстом можно работать только на текстовых слоях, по умолчанию создается растровый. Укажем тип слоя воспользовавшись свойством kind.

layerRef.kind = LayerKind.TEXT;

теперь определим текст и расположение, здесь же можно указать размер шрифта цвет и пр. свойства

layerRef.textItem.contents = «R=» + Math.round(cl.red) + » G=»+ Math.round(cl.green) +» B= «+ Math.round(cl.blue);
layerRef.textItem.position = pos;
layerRef.textItem.size = 25;

Все скрипт готов

var colorSamplerRef = app.activeDocument.colorSamplers[0];
var cl = colorSamplerRef.color.rgb;
var pos = colorSamplerRef.position;var layerRef = docRef.artLayers.add();
layerRef.kind = LayerKind.TEXT;
layerRef.textItem.contents = «R=» + Math.round(cl.red) + » G=»+ Math.round(cl.green) +» B= «+ Math.round(cl.blue);
layerRef.textItem.position = pos;
layerRef.textItem.size = 25;

Сохраняем, и попробуем запустить. Получилось неплохо, ноу такого способа есть недостаток: цвет букв может сливаться с фоном, неплохо было бы сделать свечение белого цвета, например. Как это сделать при помощи скриптов вариантов море, но самый простой такой: создадим текстовый слой, в нем настроим параметры шрифта, а так же выберем стиль слоя OUTER GLOW. Слой этот назовем myTEXT, чтобы не мешал можно его сделать скрытым. Из скриптов будем его дублировать, менять текст и расположение.

Нахожу слой при помощи свойства документа artLayers по имении и создаю копию методом duplicate().

var myTEXT = app.activeDocument.artLayers[«myTEXT»].duplicate();

Далее меняю текст и расположение таким же образом как было описано выше. Имя слоя делаю таким-же как и текст

myTEXT.textItem.contents = «R=» + Math.round(cl.red) + » G=»+ Math.round(cl.green) +» B= «+ Math.round(cl.blue);
myTEXT.textItem.position = pos;

Имя слоя делаю таким же как и текст

myTEXT.name = myTEXT.textItem.contents;

если исходный слой был невидимым, то надо сделать изменить видимость.

myTEXT.visible = true;

На этом можно было бы остановиться, но я хотел бы еще выделить место, в котором сохранили цвет. Для этого в месте выделения я создам область 20х20 px сделаю рамочку шириной 1px а внутри залью цветом из пипетки.

Для начала нам необходимо преобразовать текстовый слой в растровый.

myTEXT.rasterize( RasterizeType.TEXTCONTENTS );

Для работы с выделением пригодится объект Document.selection, в описании видим что он содержит все необходимые методы изобретать ничего не придется.

Для выделения воспользуемся методом select, который в качестве входного параметра принимает полигон (массив точек).

selRegion = Array(
Array(pos[0]-10, pos[1]-10),
Array(pos[0]-10, pos[1]+10),
Array(pos[0]+10, pos[1]+10),
Array(pos[0]+10, pos[1]-10),
Array(pos[0]-10, pos[1]-10)
);

выделяем

app.activeDocument.selection.select(selRegion);

заливаем цветом из пипетки

app.activeDocument.selection.fill(colorSamplerRef.color);

теперь сделаем рамочку, методом selectBorder

app.activeDocument.selection.selectBorder(2);

Заливать будем черным цветом. Цвет это объект SolidColor с которым уже работали.

var borderColor = new SolidColor;
borderColor.rgb.red = 0;
borderColor.rgb.green = 0;
borderColor.rgb.blue = 0;

заливаем

app.activeDocument.selection.fill(borderColor);

и снимаем выделение

app.activeDoc
ument.selection.deselect();

Итак все готово.

PS. Скрипты открывают практически не ограниченные возможности по работе с изображениями. Можно писать алгоритмы для спецэффектов, обработки фото, добавления копирайтов и т.п.