Фотошоп вставить название файла

Обновлено: 08.07.2024

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

Неужели нам остаётся лишь сносить эту му́ку? Что ж, теперь нет! Недавно я обнаружил подход, который позволит дизайнерам распрощаться с открытием 23 PSD-файлов только ради смены цвета элемента в шапке. Вместо этого мы можем поступать разумно, как наши коллеги, разработчики, и импортировать внешние файлы при помощи кое-чего с названием «Variables (Переменные)».

Сие позволит поместить многократно используемый компонент в отдельный файл и просто импортировать его во все макеты. Теперь, когда нам понадобится внести изменение, мы будем просто вносить его в одном месте.

Что такое переменные в фотошопе?

  • переменная видимости — отображает или скрывает содержимое слоя;
  • замена пикселей — переменные, которые заменяют пиксели слоя пикселями изображения из другого файла;
  • замена текста — переменные, которые заменяют строку в текстовом слое.

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

Приступим

Шаг первый: подготовка файлов

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


Обычно компонент имеет множество состояний (например, авторизованный/неавторизованный). Потому страницы стилей и создаются для компонента, чтобы показать его состояния. В идеале хотелось бы импортировать страницу стилей компонента и незаметно помещать её в макет. Это позволило бы нам получить файл, который является и стилевым и встроенным, импортируемым во все макеты, где имеется данный компонент.


Я сделал ненастоящую страницу стилей для глобального заголовка и назвал её Component_GlobalHeader.psd. Для того, чтобы следовать всем этапам, пожалуйста скачайте её.

Шаг второй: создание основы

Откройте макет сайта и создайте новый слой. Назовём его тем же именем, что и страницу стилей, т.е. Component_GlobalHeader. Это тот слой, в который мы будем совершать импорт содержимого внешнего файла.


Шаг третий: создание переменной

Пора создать переменную. Сделать это можно выбрав Image → Variables → Define. Перед вами всплывёт окно, в котором мы зададим некоторые параметры.

Во-первых, всегда проверяйте, что вы выбрали именно тот слой, который требуется. Это можно увидеть в поле «Layer (Слой)». Если слой будет задан неверно, в последствии может возникнуть бардак.


Так как мы фокусируемся на импорте, сразу переходим к «Pixel replacement (Замене пикселей)». В поле «Name (Имя)» введите то же название, что и у слоя, и у файла. Лучше всё называть одинаково, потому что это поможет в организации в будущем.


  • «Fit (Подгонка)» — масштабирует таким образом, что изображение вмещается в контейнер (некоторые части контейнера могут остаться пустыми);
  • «Fill (Заполнение)» — масштабирует таким образом, что изображение вмещается в контейнер целиком (некоторые части изображения могут выйти за пределы контейнера);
  • «As Is (Как есть)» — масштабирование не применяется;
  • «Conform (Приспособление)» — масштабирует изображение непропорционально таким образом, что оно целиком заполняет контейнер.


«Alignment (Центровку)» можно оставить как есть, по центру, но это дело предпочтений, а так же зависит от самого компонента. Раньше я выравнивал по левому верхнему углу. Всё зависит от вас.

«Clip to Bounding Box (Обрезку по рамке)», пожалуй, стоит оставить отключённым.

Жмём «Next (Следующий)».

Шаг четвёртый: импорт

Для того, чтобы импортировать файл, требуется выбрать или создать новый «Data set (Набор данных)». Наборы данных — это коллекции переменных и связанной, с ними, информации. Вы выбираете набор данных для каждого отдельного файла, так что, если у вас множество виждетов в одном файле, вам нужен только один набор с именем, например, sidebar_widgets.

Поскольку мы пока не создавали наборы данных, начнём с создания первого. Для этого кликните на маленьком значке с дискетой (возле мусорной корзины). Теперь, когда мы создали набор, давайте как-нибудь его назовём. Да, верно. Пусть именем будет имя переменной, слоя и внешнего файла. Как я говорил, они должны быть идентичны.



Вот и всё, теперь мы можем загружать внешний файл. Нажмите на кнопку выбора файла в секции «Value (Значение)» и выберите Component_GlobalHeader.psd. Заметьте, если у вас стоит галочка «Preview (Предварительный просмотр)», вы увидите, как ваш компонент появился в макете. Сверхважно: всегда нажимайте «Apply (Применить)» перед нажатием «OK». Если этого не сделать, всё, что мы сделали, будет потеряно и придётся начать сначала. Поэтому вначале «Apply (Применить)», затем «OK».


Мы импортировали внешний компонент в наш макет! Ура! Но подождите… мы же видим весь этот огромный слой, а нам нужна лишь его часть.


Шаг пятый: маскировка

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


Шаг шестой: обновление

Теперь, когда мы работаем с внешним файлом, давайте я объясню в чём прелесть этого. Допустим, что красный индикатор текущей страницы вас больше не прёт, а вместо не го хочется синего. Запросто! Открываете ваш внешний файл и меняете цвет на синий, сохраняете его и возвращаетесь к макету. Теперь выберите Image → Apply Data Sets и выберите тот набор данных, который вам нужно обновить. Вы сразу же увидите изменения.


Недостатки

Думая о потенциале метода, не забывайте, что это всё же хак. До тех пор, пока Эдоби не решит создать встроенную систему для импорта внешних PSD-файлов, у нас никогда не будет безотказного способа это делать.

Основной недостаток заключается в том, что после изменений компонента и сохранения файла, в макет эти изменения автоматически не внесутся. Это значит, что вам всегда придётся «Применять наборы данных», открывая макет. Хотя я и не пробовал подобное решение, но мне кажется, что можно создать некоторое действие, которое будет открывать PSD и автоматически применять наборы.

Тем не менее, я верю в то, что эта система сохранит бесчисленное множество часов изнуряющего механического труда. И стоит знать, когда стоит её использовать. В основном это сгодится для проектов, содержащих более 15 макетов.

Заключение

Этот пример — лишь верхушка айсберга. Вы можете и сами раскрыть весь потенциал данного метода. Будьте творческими и экспериментируйте. Почему бы не добавить все виджеть, используя лишь один набор данных?

Послесловие

Мне кажется, что многие об этом не знают. Статья по-своему актуальна на фоне сегодняшних баталий Фотошоп против Индизайна. Мне, например, не хочется переходить на Индизайн и подобная система очень облегчает работу, а также на шаг приближает Фотошоп к его «конкуренту». Надеюсь, что вам был полезен мой труд.

И ещё: если мой перевод пунктов меню расходится с локализацией, напишите мне в личку и я это поправлю.

Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal

Возможно ли написать макрос, чтобы при сохранении файла программа называла бы его по определенному шаблону, включая дату (забираемую откуда-то автоматически) и с возрастающей нумерацией? Т.е. чтобы на выходе, например, получался файл типа "Name_2013-10-15_01", где последняя цифра - переменная, как в "Untitled-1" . "Untitled-n".

Lightroom с переименованием поможет. В фотошоп это можно реализовать при массовой обработке через File-Automate-Batсh.

Edited at 2013-10-15 13:42 (UTC)

Да нет. Без батча, без лайтрума. Интересует исключительно реализация с помощью обычного макроса. Но вполне допускаю, что невыполнимая задача. Но спасибо anyway. Попробуй через total commander заходишь в нее, выбираешь несколько файлов, дальше "Файлы", групповое переименование, настраиваешь как будешь переименовывать и "Выполнить". вот еще способ:
Выделяешь нужные файлы, жмёшь F2 и переименовываешь первый будет называться например "файл" второй "файл (1)" третий "файл (2)" и т.д. У человека несколько иные запросы. Речь именно об автоматическом именовании файла при сохранении. А так правда можно было бы через Automate->Batch провернуть.

У меня Far есть, зачем же я TotalCmd буду пробовать? ;)) Второй способ тоже не катит: не это нужно. Не переименование файлов по маске, а выдача названия конкретно с помощью Adobe Ps.

Edited at 2013-10-16 09:18 (UTC)

я юзаю renamer и доволен - одним махом за секунду переименовываются тысячи файлов по заданному правилу.

Edited at 2013-10-16 08:55 (UTC)

Не знаю, что такое ренеймер. У меня Far стоит - достаточно. Но задача совсем не в этом. Макросы (action) не умеют управлять именами файлов. Подобную функция можно реализовать только через скрипты.
Даже при небольшом опыте программирования реально написать JavaScript с данной функцией. Да, ёпрст, раз вы такой знаток - ссылку-то киньте, коль всё так элементарно. я написал выше. уже понятно, что вам это не подходит. Задача стоит специфическая. Если бы была легко решаемой или гуглибельной - я б сюда не полезла, естественно. Может, она вообще не решаемая. Потому я и спрашиваю не "как", а "можно ли". После ответа l_axr_l уже можно спрашивать, как. Поразбираюсь, как будет время. если вдруг у вас что-то получится - будьте так любезны, маякните мне пожалуйста. ежедневно по нескольку десятков раз отважно борюсь с собственной ленью - вбивать все это руками надоедает адски У меня нет опыта программирования и не собираюсь его зарабатывать. Но если черканёте пару строк конкретики по реализации ровно этой задачи - разберусь.

Хорошо, давайте попробуем.

Я решал проблему в чем-то похожую на вашу, аналогичные моменты постараюсь объяснить.
Скрипта нужно будет два. Первый будет запоминать папку куда вы будете сохранять ваши файлы и постоянную часть имени.

Озаботился созданием скрипта, который делал бы в файле текстовый слой с именем файла. Также желательно отрезать у имени первые 8 символов и расширение (имена длинные).

С тоской смотрю через ScriptListener на километр кода, остающийся после создания простого текстового слоя, и обращаюсь к специалистам за помошью: CMYK, откликнитесь !

Забанен

Ответ: Скрипты - впечатать имя файла на фото

Внизу скрипта, в комментариях - скопированные из pdf'а свойства и методы для объекта textItem. Поскольку script listener лучше всего использовать для создания экшнов в скрипте, то он как и экшн фиксирует состояние всех этих свойств, что в результате и порождает то, что вы видели в его логах.

То есть, приписываете к объектной переменной myTextRef нужные свойства из перечисленных и определяете их величинами (ссылками на объект, например для свойства color нужно сначала создать объект SolidColor, которому определить цвета, а затем этот объект определить в свойство color объекта textItem)

В общем, разбирайтесь, если чего непонятно - спрашивайте. Лучше написать один раз полноценный скрипт, чем затем в Шопе, экшнами или вручную доводить до ума его результат.

Ответ: Скрипты - впечатать имя файла на фото

Спасибо за столь быстрый отклик!
Вечером попробую, о результатах напишу позже.

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

Возможность-класс,скрипт-суперский.Давно хотел создать такую тему.
Только у меня пара вопросов:
Где можно найти точное название шрифтов (для вписания в скрипт)?
Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?

Забанен

Ответ: Скрипты - впечатать имя файла на фото

Названия шрифтов отображаются в списке при выбранном Text Tool'е Если вы хотите иметь возможность задавать параметры текстового слоя не в коде скрипта, а в диалоговом окне, то нужно мастерить это окно, которое как и следует ожидать, будет повторять "текстовые" палитры Фотошопа. Рисовать формы на яве я не умею, потому что в яве ничерта не понимаю. На VB запросто. Но это будет уже exe-файл, который из экшна вы не запустите (и из ява-скрипта тоже, если не откроете дыру в безопасности).

Кстати, методом исследования кода экшнов я нашел что стили фонта кодируются так: Arial-Bold, или там Arial-Bold-Italic. Поскольку никаких свойств Bold или Italic для объекта textItem не предусмотрено. Это еще добавляет геморроя.

Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?

Нихрена не понял. Закрытие с сохранением можно вписать прямо в тело скрипта. Что такое "оставить текстовый слой активным", а уж "например вставить Enter" я не могу врубиться. Опишите задачу как-то иначе.

"Вставить Enter" - типа вставить перенос строки?

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

Названия шрифтов отображаются в списке при выбранном Text Tool'е Если вы хотите иметь возможность задавать параметры текстового слоя не в коде скрипта, а в диалоговом окне, то нужно мастерить это окно, которое как и следует ожидать, будет повторять "текстовые" палитры Фотошопа. Рисовать формы на яве я не умею, потому что в яве ничерта не понимаю. На VB запросто. Но это будет уже exe-файл, который из экшна вы не запустите (и из ява-скрипта тоже, если не откроете дыру в безопасности).

Кстати, методом исследования кода экшнов я нашел что стили фонта кодируются так: Arial-Bold, или там Arial-Bold-Italic. Поскольку никаких свойств Bold или Italic для объекта textItem не предусмотрено. Это еще добавляет геморроя.

Скрипт у меня записан в акшен,после скрипта идёт сайв и клоузе.
Можно ли оставить текстовый слой активным (например вставить Enter)?

Нихрена не понял. Закрытие с сохранением можно вписать прямо в тело скрипта. Что такое "оставить текстовый слой активным", а уж "например вставить Enter" я не могу врубиться. Опишите задачу как-то иначе.

"Вставить Enter" - типа вставить перенос строки?


У меня до скрипта и после него в действии ещё куча операций.
"Вставить Enter" - это и есть вставить перенос строки.
Активным значит- ещё редактируемым (Может я опять не правильно выразился,короче, посмотри рисунок).
И кстати,как ты смотришь код экшнов

Вложения

Забанен

Ответ: Скрипты - впечатать имя файла на фото

"Enter", в смысле перенос строки (hard return) это два символа в Винде: CR & LF (Carriage Return & Line Feed), с кодами ASCII 13 и 10 соответственно. В VB есть константа - vbCrLf, то есть, Chr(13) & Chr(10)

А в яве (Си) вот такой формат: "\r"

Значит если вам нужно написать несколько строк текста, то вы составляете строку таким образом:

myName = s1 + "\r" + s2; И так далее.

"Редактируемым" - такой фигни нет. В принципе, наверное, можно попробовать через "кнопконажиматель" этого добиться, но уверен что оно того не стоит. Лучше изменить экшн, переписав его на скрипт. Что касается создания текста с разноцветными буквами разного кегля и стиля - в объектной модели Шопа доступной пользователю нет и намека на нечто типа textRange.

Как я смотрю код экшнов? Ну а вы как? - Разворачиваете команды экшна и смотрите чего там понаписано. Касательно экшна для создания текста - понаписано там дочерта. Можно и Script Listener активировать и тогда выполняемые действия запишутся в лог-файл, для явы и для басика (а у ЦС и для эппл-скрипта как я понимаю). Там можно поковыряться и написать функции, которые восполняют пробелы в объектной библиотеке и библиотеке типов - например создание guidelines, или там команды типа Apply Image.

Забанен

Ответ: Скрипты - впечатать имя файла на фото

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

Например, я с помощью скрипта создаю экшн в памяти Шопа и запускаю его чтобы создать guideline. После чего я не могу проконтролировать - создалась направляющая или нет, каковы ее координаты и так далее. А если я создаю через объектную модель, например, тот же текстовый слой, то храня ссылку на этот объект в объектной переменной, я могу в любое время выполнения скрипта обратиться к объекту за нужной мне информацией или наоборот, поместить в объект некоторую информацию.

Вот как в этом скрипте: сначала создается объект, затем меняются его свойства. Если, например, не вписать кегль фонта и название и цвет, то будет текст черного цвета, 3 пт, и Courier (у меня по крайней мере).

А с помощью экшн-технологии вы так не можете делать - после того как объект создан, следующая команда в экшне не знает про него ничего. Поэтому все параметры объекта устаналиваются в одной команде экшна, которая его и создает.

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

Всё понятно - писать и пользоваться скриптами не для простых смертных,таких как я.
Но У меня ещё маленький вопрос можешь подсказать кое-что:
Нужен такой скрипт который связывает действие с шириной файла.
Если такая-та ширина то действие 1,если другая действи 2 и т.д.
Заранее спасибо

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

А можно ли, чтоб имя выводилось не в текстовом слое,а копировалось
в буфер обмена.Тогда редактировать будет проще, нажал ctrl+V и пиши
дальше что хочешь.

Забанен

Ответ: Скрипты - впечатать имя файла на фото

Можно. Тут же был где-то скрипт который опеределяет больше ширина высоты документа или нет и выполняет в двух ветках разные действия. Ну так вот, если сравнивать не ширину с высотой, а с фиксированными величинами то можно наплодить сколько угодно веток, в каждой из которых будет выполняться своя операция.

Наверное в яве вообще есть операции с буфером обмена, но поскольку я мало очень в яве понимаю то не знаю о них, и второе - у Шопа ява своя, со своими ограничениями, среди которых может запросто оказаться и отсутствие работы с клипбордой. Для объекта Selection есть команды копирование, вырезки и вставки, но ими кусок текста из переменной в буфер не закинуть.

Я вам вот что скажу. Комбинировать скрипты и экшны нужно только тогда, когда явно скриптом невозможно сделать какую-то операцию. Поэтому, пересмотрите свою идеологию, изложите задачу и вполне возможно у вас будет нормальный скрипт, который делает все сам.

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

А "Тут же был где-то скрипт" это где ?
И есть ли первод документа "PS 7.0 Scripting Guide.pdf" ?

Забанен

Ответ: Скрипты - впечатать имя файла на фото

А что там переводить-то, яву что ли, на русский язык переводить?

Я вам могу посоветовать, если уж вы там что-то разрабатываете что-то сложнее чем open\save, перейти на VB, по крайней мере там хотя бы из объектной библиотеки будете получать подсказки как и что можно сделать. Да и по API-функциям в VB хорошо - практически все что хотите можно встроить.

И еще по Адобской документации на скриптинг. Уроды они, я утверждаю это. Уроды в кубе. Мало того что в документации примеров нет вообще, описаний практически никаких, так в Шопе-8, они уже bookmark'и поубивали и копировать текст из pdf'ов запретили. Каково?

Да и вообще, какой там блин, док по скриптингу на русском, если справку Шопа никто на русский с версии 4 не переводил.

Забанен

Ответ: Скрипты - впечатать имя файла на фото

Кстати, только что напоролся на сук: если в полном имени файла есть символ % - процентов, то ява сбивается с его пути, и в результате файл оказывается записан на одну или на несколько папок выше указанной. Веселуха. Очевидно этот символ для явы - специальный, после которого должен идти ASCII код какого-то "неправильного" для сети символа, типа пробела, например. Бардак, а не военная часть. Теперь придется разбираться еще и с этим.

Фотограф

Участник

Ответ: Скрипты - впечатать имя файла на фото

Только не бейте ногами,что такое объектная среда.

Забанен

Ответ: Скрипты - впечатать имя файла на фото

Дисклэймер. Я сам не профессиональный программист и поэтому ответственности за нижеследующее не несу.

Объектная среда когда кругом объекты. Объект обладает свойствами и методами. Имеет данные и процедуры обработки этих данных, которые тоже, данные. В обычном мире, например, объект "колесо" имеет свойство "круглое" и метод "катиться". Очевидно что и любой объект имеющий свойство "круглый" будет обладать методом "катиться", хотя может быть вовсе не колесом.

Программно объект это набор функций образующих его интерфейс. То есть, вы знаете где объекту нужно нажать, чтобы оттуда, откуда вы знаете потекло то, что вам нужно. Вы не получаете доступ внурь объекта, вы пользуетесь его интерфейсом связываясь с объектом посредством т.н. объектных переменных. В некоторых языках, типа Явы - вообще все кругом объекты. Несмотря на очевидную избыточность такого подхода (из набора в 100 свойств и 20 методов вам понадобится 2 свойства и 1 метод, а тело объекта все равно будет включено в виде библиотеки или кода в вашу программу целиком), он оправдывает себя полностью - вы общаетесь с объектом на "высоком уровне", и тем самым ваш собственный код сокращается чрезвычайно и что самое главное сокращается вследствии этого количество ошибок и время на их отлов.

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

Вот это и есть объектная среда. Когда вас окружают объекты, о внутреннем устройстве которых вы можете ничего не знать, но умея пользоваться их интерфейсом (для чего достаточно почитать оперэйшн мануал) вы управляете ими и получаете от них результат.

Так вот, в программировании те же самые объекты как телевизор, газета, радио, и тп, только в виде программных модулей, блоков. Из которых вы и строите свою программу.

У Photoshop-а есть COM API, в котором покрыты многие из фотошоповских функций. Его, разумеется, можно использовать из JS- или VBS-скриптов. Adobe любезно предоставила разработчикам свою IDE, с автокопмлитом и брейкпоинтами. Поддерживаемые языки в ней JScript, VBScript (Win) и AppleScript (Mac). Я остановился на JScript, потому как большинству будет лучше всего понятен именно он.

  • по умолчанию установлен не моноширинный шрифт, а какая-то дрянь. Тут же пофиксил
  • нет watch-ей. За это казнить надо. Их роль выполняет data browser и javascript console
  • по привычке нажал ctrl-D (копирует строчку в Решарпере) – и о чудо, оно работает!
  • там есть профайлинг
  • хелп есть, по контенту сносный, но до уровня msdn недотягивает.

Удобно, особенно если надо написать скрипт для фотошопа под заказ и не хочется давать исходники. Насчёт возможности его декомпиляции я детально не разбирался, но думаю, что переменные он меняет и кое-какую оптимизацию всё-таки делает.
Итак, IDE на первый взгляд неудобная, но поработав в ней минут 30, привыкаешь.

Скриптовый язык

Т.к. ExtendScript кроссплатформенный, пути к файлам представляются как /d/Temp/…

Живой пример

logo example


Задача: в папке есть 100 файлов. Надо внедрить в каждый из них лого, которое есть в PSD-файле.
Пример лого:

А вот и скрипт:

app.open(logoFile); // открываем лого
app.activeDocument.artLayers[ "Text" ].copy(); // ArtLayers – слои в файле. Этот слой назывался "Text"
var logoWidth = app.activeDocument.width. as ( "px" );
var logoHeight = app.activeDocument.height. as ( "px" );
app.activeDocument.close();

app.open(photoFile); // открываем фотку

var width = app.activeDocument.width. as ( "px" );
var height = app.activeDocument.height. as ( "px" );

var logoLayer = app.activeDocument.artLayers.add(); // добавляем на фотку новый слой, куда поместим лого
logoLayer.name = "Logo" ; // название нового слоя

app.activeDocument.paste(); // вставляем лого из clipboard

var shape = [ // Photoshop вставляет всё в середину; выделяем лого, чтобы перенести его
[(width - logoWidth) / 2, (height - logoHeight) / 2],
[(width - logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height + logoHeight) / 2],
[(width + logoWidth) / 2, (height - logoHeight) / 2]
];
app.activeDocument.selection.select(shape);

app.activeDocument.selection.translate( // переносим selection вправо вниз
new UnitValue((width - logoWidth)/ 2, "px" ),
new UnitValue((height - logoHeight) / 2, "px" ));

var minImageDimension = Math.min(width, height); // масштабируем лого, чтобы оно было в 5 раз меньше минимального размера фотки
var logoScaleMultiplier = minImageDimension / 5 / logoWidth * 100;
app.activeDocument.selection.resize(logoScaleMultiplier, logoScaleMultiplier, AnchorPosition.BOTTOMRIGHT); // обратите внимание на последний аргумент

app.activeDocument.artLayers[ "Logo" ].opacity = 75; // делаем слой полупрозрачным
app.activeDocument.artLayers[ "Logo" ].blendMode = BlendMode.LUMINOSITY; // устанавливаем режим смешивания, чтобы выглядело симпатичнее
// а вот тут бы установить blending options! Об этом читайте дальше.
SaveFile(outputFile); // сохранит и закроет файл
>

function SaveFile(outputFile) var isPng = /png$/i.test(outputFile);
var saveOptions;
if (isPng) saveOptions = new PNGSaveOptions();
> else saveOptions = new JPEGSaveOptions(); /* неинтересный код про качество картинки */
>
app.activeDocument.saveAs(File(outputFile), saveOptions, true , Extension.LOWERCASE)
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); // закрываем документ
>

фото с лого

Скрипт готов. Осталось сделать лого в формате PSD – такое, чтобы внутри был слой Text, на котором и должно быть размещено лого.
Пример того, что получится:

Полностью скрипт вылолжил на pastebin.

О грустном

  • записав Action с этими настройками и выполнив его (спасибо за подсказку serge2)
  • сохранить стиль в preset-ах (используя кнопку «New Style» в диалоге «Blending Options»)

Немного о недокументированном API

  1. Скопировать файл «ScriptListener.8li» из %ProgramFiles%Adobe\Adobe Photoshop CS5\Scripting\Utilities\ в %ProgramFiles%Adobe\Adobe Photoshop CS5\Plug-ins\Automate\
  2. (пере)запустить Photoshop
  3. Сделать то действие, о котором хочется узнать
  4. Найти на рабочем столе файлы ScriptListener.jsx и ScriptListener.vbs
  5. Не забыть удалить ScriptListener.8li (он тормозит работу Photoshop)

Как вы думаете, что делает этот код? Он добавляет тень (Drop Shadow) к слою, это видно по название «DrSh». Я подозреваю, что внутри Photoshop-а прямо так и называются контролы в GUI.
Но, выполнив этот код, обнаружим, что он работает.
Можно найти, что executeAction может как показать диалог пользователю, так и сделать свою работу молча (это определяет последний параметр). Сами ID-шники нигде не описаны, о них (как и о том, что будет с ними в CS6) мы можем только гадать.
Тем не менее, фича логгирования действий довольно интересная, если очень надо, можно по-быстрому накидать скриптик для себя.

Ещё скрипты

  • ресайзинг картинок до определённого размера (ширина не больше X, высота не больше Y)
  • добавление рамок к картинкам – таких же, как в этом топике

Интересные факты

  • в API есть поддержка RAW. После того, как вы обработали RAW-файлы в Photoshop-е, сохранив в них настройки, вы можете быстро сконвертировать их в JPEG
  • в отличие от blending options, фильтры представлены в API довольно хорошо, для каждого из них есть функция
  • код в jsx-файлах можно вешать на события в Photoshop: например, при открытии файла добавлять в него новый слой, и так далее
  • API есть и для Illustrator, и для Bridge
  • из API есть доступ к гистограмме и к каналам

Выводы

API вкусное, очень вкусное. Но отсутствие поддержки blending options сильно удручает; если они нужны – будьте готовы к тому, что придётся возиться со страшным кодом. Если всё, что вам надо (что как раз и надо в большинстве случаев от пакетной обработки) – обвести картинку рамочкой, думаю, ImageMagick в этом случае будет быстрее и намного удобнее.

фильтры, гистограммы
RAW
color profiles, как в Photoshop-е
javascript – удобный, понятный почти всем язык
документация с примерами
отсутствие blending options
для работы нужен Photoshop /* внезапно */
работает довольно медленно

Почитать

Adobe Photoshop Scripting – официальный ресурс
Scripting Photoshop – небольшой, но полезный тьюториал по скрпитингу в Photoshop
PS-Scripts – форум о скриптах для Photoshop

Читайте также: