Работа с объектной моделью Photoshop.
Использование объекта Application.
Свойства и команды объекта Application применяются для:
· Настройки параметров Photoshop, такие как единицы измерения, настройки цвета.
· Документы – Вы можете добавлять, открывать документы, делать их активными.
· Операции – вы можете запускать скрипты или операции, созданные через палитру операций.
· Получить список шрифтов, установленных в системе:
var fontsInstalled = app.fonts
· Получить сведения о свободной памяти в системе:
var freeMem=app.freeMemory
· Получить путь к папке Photoshop Settings
var prefFolder=Folder(app.preferencesFolder)
Использование объекта Document.
Объект Document можно представить как любой открытый документ, как файл или холст.
Документ как объект позволяет:
- Получить доступ к объектам слоям или каналам;
- Манипулировать свойствами документа такими, как положение, кадрировка, размер как изображения, так и холста, отражением и т.д.;
- Получить текущий слой;
- Сохранить текущий документ;
- Копировать и вставлять в текущий, или другой документ;
Управление объектом Document.
Пример, демонстрирующие управление документом:
//Объявить переменную для существующих настроек единиц измерения
startRulerUnits = app.preferences.rulerUnits
//Установить единицы измерения - Дюймы
app.preferences.rulerUnits = Units.INCHES
//Объявить переменную для существующего файла (Ducky.tif)
var fileRef = new File(app.path + "/samples/ducky.tif")
//Объявить переменную для открываемого документа
var docRef = app.open(fileRef)
//Изменить размер изображения на 4х4 дюйма
docRef.resizeImage( 4, 4 )
//Изменить размер холста на 4х4 дюйма
docRef.resizeCanvas( 4, 4 )
//Обрезать верх и низ изображения
docRef.trim(TrimType.TOPLEFT, true, false, true, false)
//Команда Crop использует единицы измерения Пиксели
// Установить единицы измерения - Gbrctkb
app.preferences.rulerUnits =Units.PIXELS
docRef.crop (new Array(100,200,400,500), 45, 20, 20)
//Повернуть холст
docRef.flipCanvas(Direction.HORIZONTAL)
//Восстановить исходные единицы измерения из переменной startRulerUnits
app.preferences.rulerUnits = startRulerUnits
Работа с объектом Layer.
Объектная модель Photoshop содержит два типа объектов Layer:
ArtLayer объект может содержать изображение и эквивалентен привычному понятию слоя в приложении Photoshop, этот объект может быть текстовым слоем при установке соответствующего параметра.
LayerSet – объект группа слоев, который может содержать 0 или более объектов artLayer, а так же 0 или более объектов LayerSet.
Каждый объект artLayer и LaerSet имеют соответствующие коллекции объектов artLayers и LayerSets, у которых есть команды add(). На объекты artLayer и LaerSet можно ссылаться, но добавлять эти объекты нельзя, команд add() они не имеют.
Создание объектов ArtLayer.
Пример показывает создание объекта ArtLayer, залитый красным цветом.
//Создать новый документ
app.documents.add()
// Объявить переменную для нового слоя
var layerRef = app.activeDocument.artLayers.add()
//Имя нового слоя - MyBlendLayer
layerRef.name = "MyBlendLayer"
//Режим наложения - Normal
layerRef.blendMode = BlendMode.NORMAL
//Выделить все в текущем документе
app.activeDocument.selection.selectAll
//Объявить переменную для цвета заливки слоя
var colorRef = new SolidColor
colorRef.rgb.red = 255
colorRef.rgb.green = 0
colorRef.rgb.blue = 0
//Залить текущее выделение цветом
app.activeDocument.selection.fill(colorRef)
Создание объекта LayerSet.
Пример показывает создание слоя, после создание группы слоев, перемещение группы слоев ниже созданного слоя, в текущем документе:
//Создать новый документ
app.documents.add()
//Создать новый слой
app.activeDocument.artLayers.add()
//Объявить переменную для верхнего слоя документа
var layerRef = app.activeDocument.layers[0]
//Объявить переменную для создаваемой группы слоев
//Группа слоев будет создана в начале документа
var newLayerSetRef = app.activeDocument.layerSets.add()
//Переместить группу слоев вниз после первого слоя
newLayerSetRef.move(layerRef, ElementPlacement.PLACEAFTER)
Обращение к объектам ArtLayer.
Когда в программе Photoshop создается слой, он добавляется на палитру слоев и получает свой номер, этот номер используется в имени слоя и не соответствует индексу объекта artLayer, создаваемому через скрипт.
Скрипт всегда нумерует индексы таким образом, что индексы нумеруются сверху вниз, нулевой индекс всегда будет верхним слоем, тогда как имена слоев будит нумероваться снизу вверх. Например, если документ имеет 4 слоя, то они будут именоваться: Background, Layer1, Layer2, Layer3. Слой Layer3 будет находиться сверху, т.к. добавлен последним, его индекс будет 0.
Можно использовать следующие команды, чтобы ссылаться на слои по именам данным им программой:
layers["Layer 3"].name //в коллекции слоев, заключайте в квадратные скобки имя слоя
Работа с объектом LayerSet.
Существующие слои можно перемещать в наборы слоев.
Пример показывает как создать набор слоев, продублировать слой, дубликат поместить в набор слоев:
//Объявить переменную для нового документа (создать новый документ)
var docRef = app.documents.add()
//Создать новый слой
docRef.artLayers.add()
//Объявить переменную для группы слоев (создать группу слоев)
var layerSetRef = docRef.layerSets.add()
//дублировать слой с нулевым индексом и положить его в группу слоев
var layerRef = docRef.artLayers[0].duplicate(layerSetRef, ElementPlacement.PLACEATEND)
Связывание слоев.
Скрипты позволяют также связывать и отвязывать слои, чтобы была возможность перемещать и преобразовывать слом при помощи одного слоя связанного с остальными.
//Создать новый слой
var layerRef1 = docRef.artLayers.add()
//Создать новый слой
var layerRef2 = docRef.artLayers.add()
//Связать слои
layerRef1.link(layerRef2)
Link() является методом объекта artLayer
Применение стилей к слоям.
В скрипте стиль "Puzzle (Image)" из стандартного набора применяются к объекту artLayer слой "Layer 1", командой applyStyle()
docRef.artLayers["Layer 1"].applyStyle("Puzzle (Image)")
applyStyle() является методом объекта artLayer.
Использование объектов Text Item - текстовых слоев.
Для использования текстовых слоев необходимо изменить существующий объект artLayer в объект Text Item? Обратный процесс называется растеризацией текста.
Объект TextItem является свойством объекта artLayer. Чтобы создать текстовый слой вам необходимо создать объект artLayer, затем изменить свойство kind на значение LayerKind.TEXT.
Создание текстового слоя:
var newLayerRef = docRef.artLayers.add()
newLayerRef.kind = LayerKind.TEXT
Определение типа слоя:
//Создание нового документа
var docRef = app.documents.add()
//Создание нового слоя
var newLayerRef = docRef.artLayers.add()
//Изменение типа слоя на текстовый
newLayerRef.kind = LayerKind.TEXT
//Проверка тип слоя
if (newLayerRef.kind == LayerKind.TEXT)
{alert("Это тестовый слой")}
Определение типа текущего слоя:
var LayerRef = activeDocument.activeLayer
if (LayerRef.kind == LayerKind.TEXT)
{alert("Это текстовый слой")} else {alert("Это не текстовый слой")}
Для создания и управления текстом в текстовом слое, вы используете значения TextItem, которые содержится в объекте textItem, который является свойством объекта artLayer.
Добавление текста в объект TextItem:
//Создание нового документа
var docRef = app.documents.add()
//Создание нового слоя
var textLayerRef = docRef.artLayers.add()
//Присвоение имени нового слоя
textLayerRef.name = "my text"
//Изменение типа слоя на текстовый
textLayerRef.kind = LayerKind.TEXT
//Переменная связанная с объектом textItem
var textItemRef = docRef.artLayers["my text"].textItem
//Заполнение содержимого текстового слоя
textItemRef.contents = "Hello, World!"
//Выравнивание текста по левой стороне
textItemRef.justification = Justification.LEFT
Все свойства и методы текстового объекта посмотреть в справочнике по скриптам JavaScript
Если вы хотите узнать о свойствах объекта, то ищите textItem, если вы хотите больше узнать о методах и значениях текстового объекта ищите TextItem.
Работа с объектом выделение.
Объект выделение — это часть изображения, выделенная для каких-либо манипуляций, например дублирования на слое, цветокоррекции, поворота и т. д. Выделенная область содержит все пиксели, выделенные частично или полностью, которые включены в границы выделения.
Для получения подробной информации об объекте, как свойстве объекта document ищите selection, для получения сведений о методах выделения ищите select.
Свойство selection содержит информацию о уже существующем выделении, поэтому новое выделение можно создать при помощи select, а не selection.
Создание выделения.
Для создания выделения используется команда select(). Выделение определяется координатами углов области выделения. Поскольку ваш документ является 2-мерным, вы задаете координаты с помощью осей x и y следующим образом: ось x для указания горизонтального положения на холсте, ось y для указания вертикального положения на холсте.
Исходная точка в Photoshop, по оси X = 0 и по оси Y = 0, находится в верхнем левом углу экрана. Например, если ваш холст имеет размер 1000 x 1000 пикселей, то координата для нижнего правого угла равна по оси X = 1000 и по оси Y = 1000.
Вы указываете координатные точки, описывающие фигуру, которую вы хотите выбрать в виде массива, который затем становится аргументом или значением параметра для команды select ().
В следующем примере предполагается, что единицы измерения линейки были установлены в пикселях, и создается выделение 100х100:
//Создание нового документа размером 500х500px
var docRef = app.documents.add(500, 500)
//Создание переменной - массива координат углов выделения
var shapeRef = [
[0,0],
[0,100],
[100,100],
[100,0]
]
//Создание выделения в документе
docRef.selection.select(shapeRef)
Результат:
Обводка границы выделения.
Следующий пример показывает применение команды stroke() на объекте выделения, для обводки выделения нужным цветом и толщиной:
//Определение цвета обводки
strokeColor = new SolidColor
strokeColor.rgb.red = 255
strokeColor.rgb.green = 64
strokeColor.rgb.blue = 255
//Применение обводки толщиной 4px, вовнутрь, режим наложения Normal, прозрачность 75%
app.activeDocument.selection.stroke (strokeColor, 4,StrokeLocation.INSIDE, ColorBlendMode.NORMAL, 75, false)
Инвертирование выделения.
// В переменную selRef помещается текущее выделение
var selRef = app.activeDocument.selection
//Инвертирование выделения
selRef.invert()
Расширение, сжатие, растушевка выделения.
// В переменную selRef помещается текущее выделение
var selRef = app.activeDocument.selection
//Расширить выделение на 5px
selRef.expand( 5 )
//Сжать выделение на 5px
selRef.contract( 5 )
//Растушевка выделения 5px
selRef.feather( 5 )
Заливка выделения цветом.
//Назначение цвета заливки
var fillColor = new SolidColor()
fillColor.rgb.red = 255
fillColor.rgb.green = 0
fillColor.rgb.blue = 0
//Заливка выделения цветом, режим наложения Normal, прозрачность 25%
app.activeDocument.selection.fill( fillColor, ColorBlendMode.NORMAL, 25, false)
Загрузка и сохранение выделения.
Можно сохранять выделения в объектах каналов или загружать из них.
Для сохранения выделения, в канал, необходимо свойству канала kind присвоить значение типа канала - SELECTEDAREA
//Переменная docRef принимает активный документ
var docRef=activeDocument
//Создаем новый канал
var chanRef = docRef.channels.add()
//Имя канала
chanRef.name = "My Channel"
//Тип канала определяем как выделенная область
chanRef.kind = ChannelType.SELECTEDAREA
//Сохраняем выделение в канал с именем "My Channel", как новое выделение
docRef.selection.store(docRef.channels["My Channel"], SelectionType.EXTEND)
Загрузка выделения из канала.
var docRef=activeDocument
var selRef = docRef.selection
//Загрузка выделения из канала "My Channel", как новое выделение
selRef.load (docRef.channels["My Channel"], SelectionType.REPLACE)
Загрузка выделения как SelectionType:
- REPLACE - как новое выделение или заменить существующее.
- EXTEND - добавить к выделению.
- DIMINISH - исключить выделение из существующего.
- INTERSECT - выделение области, где новое выделение пересекается с уже существующим выделением.
Работа с каналами.
Объект Channel предоставляет доступ к большей части доступных функций работы с каналами. Можно создать, удалить, дублировать каналы, изменить тип канала, получить гистограмму и изменить ее.
Изменение типа канала
Вы можете изменить тип любого канала, кроме компонентных каналов. В следующих примерах показано, как изменить канал замаскированной области на выбранный канал области:
channelRef.kind = ChannelType.SELECTEDAREA
Значения типа канала:
- SELECTEDAREA - Альфа канал, где цвет определяет выделенную область.
- COMPONENT - Канал, связанный с цветовой моделью документа.
- MASKEDAREA – Альфа канал, где цвет определяет замаскированную область.
- SPOTCOLOR - Альфа канал, для хранения spot цвета.
Работа с объектом Document Info.
Информацию о документе можно посмотреть и изменить через меню File > File Info
В скриптах используется объект DocumentInfo как свойство объекта документ и метод info
Заполнение информации о правах и сайте в документе:
var docRef=activeDocument
docInfoRef = docRef.info
docInfoRef.copyrighted = CopyrightedType.COPYRIGHTEDWORK
docInfoRef.ownerUrl = "http://www.adobe.com"
Использование объектов состояния истории
В скриптах можно получить доступ к состояниям истории объекта документа с помощью объекта HistoryStates, который является свойством объекта документа.
var docRef=activeDocument
//Возврат к началу истории
docRef.activeHistoryState = docRef.historyStates[0]
Очистить состояние истории:
app.purge(PurgeTarget.HISTORYCACHES)
В приведенном ниже примере сохраняется текущее состояние, применяется фильтр, а затем возвращается к сохраненному состоянию истории:
var docRef=activeDocument
//Запоинить состоянии истории в переменную
var savedState = docRef.activeHistoryState
//Любое действие - в примере Размытие в движении
docRef.artLayers[0].applyMotionBlur( 20, 20 )
//Врозврат к сохраненному состоянию в переменной
docRef.activeHistoryState = savedState
Использование объекта события.
Объект Notifier используется для привязки события к сценарию. Например, если вы хотите, чтобы Photoshop автоматически создавал новый документ при открытии приложения, вы можете привязать сценарий, создающий объект документа, к событию открытия приложения.
Команда add требует указать идентификатор события, для которого будет настроено уведомление. Многие идентификаторы событий перечислены в документации Adobe Photoshop JavaScript Scripting Reference. Некоторые события также работают с несколькими типами объектов, и команда add требует дополнительного аргумента для идентификатора класса объекта. Например, команда "New" используется для объектов Document, Art Layer, и Channel.
Примечание: Вы можете определить идентификаторы событий и классов любого записываемого события с помощью ScriptListener. См.раздел “Использование ScriptListener для поиска идентификаторов событий и классов” на стр. 81.
В следующем примере показано, как настроить уведомление о событии "Открыть документ", при открытии документа запускается скрипт Welcome.jsx
//Включение об уведомлении о событиях
app.notifiersEnabled = true
//Настройка уведомления
var eventFile = new File(app.path +"/Presets/Scripts/Event Scripts Only/Welcome.jsx")
//Добавление уведомления при открытии документа
app.notifiers.add("Opn ", eventFile)
Уведомление обычно не влияет на события, происходящие внутри скрипта, поскольку эти события встроены в событие " AdobeScriptAutomation Scripts".
Использование объекта PathItem.
Чтобы создать объект PathItem, необходимо добавить элемент PathItem в элемент или коллекцию PathItems для документа. Для этого необходимо сначала создать массив объектов PathPointInfo, которые задают координаты углов или опорных точек вашего пути. Затем вы создаете массив объектов SubPathInfo, содержащий массивы точек пути. Как только у вас есть точки и подпуть, вы можете добавить новый PathItem.
Следующий пример создает объект PathItem, представляющий собой прямую линию.
//Создание нового документа
var docRef = app.documents.add(1000, 1000, 72, "Simple Line")
//Создание массива содержащего объекты пути
var lineArray = new Array()
//создание 1 точки
lineArray[0] = new PathPointInfo
lineArray[0].kind = PointKind.CORNERPOINT
lineArray[0].anchor = Array(100, 100)
lineArray[0].leftDirection = lineArray[0].anchor
lineArray[0].rightDirection = lineArray[0].anchor
//Создание 2 точки
lineArray[1] = new PathPointInfo
lineArray[1].kind = PointKind.CORNERPOINT
lineArray[1].anchor = Array(500,500)
lineArray[1].leftDirection = lineArray[1].anchor
lineArray[1].rightDirection = lineArray[1].anchor
//Создание объекта SubPathInfo
var lineSubPathArray = new Array()
lineSubPathArray[0] = new SubPathInfo()
lineSubPathArray[0].operation = ShapeOperation.SHAPEXOR
lineSubPathArray[0].closed = false
lineSubPathArray[0].entireSubPath = lineArray
//Создание элемента пути комаyдой add(). Этот метод использует объект SubPathInfo
//Возвращает объект PathItem, который добавляется в коллекцию pathItems документа
var myPathItem = docRef.pathItems.add("A Line", lineSubPathArray);
//Применение обводки для наглядности
myPathItem.strokePath(ToolType.BRUSH)