При обработке фотографий я использую маски с эллиптическим виньетированием. При подготовке фотографий для ЖЖ все они в итоге имеют размер 800х533 пикселей, поэтому для них создание эллиптического выделения просто записывается в Action. Но как быть с фотографиями, предназначенными для печати? После кадрирования у меня есть набор фотографий с соотношением сторон 3:2, но разными размерами, и тут прежняя стратегия не работает. Мне нужно получить "Select All", но не с прямоугольным, а с эллиптическим выделением. Самое простое, что приходит в голову - это увеличить все фотографии до максимального размера, соответствующему мегапиксельности фотоаппарата. Но это как-то черезжопственно. В самом фотошопе стандартных средств для осуществления задуманного нет, и размеры выделения в процентах задавать нельзя. Перелопатив кучу форумов, я никаких простых решений не нашёл и обратился к изучению скриптов.
Первое, что нам понадобится -
Photoshop JavaScript Reference.
Скрипт - этой текстовый файл с расширением *.jsx (для JavaScript), запускается через File>Scripts>Browse...
Чтобы выделить весь документ, надо написать такую строчку:
activeDocument.selection.selectAll();
Немного почитав мануал, я усложнил скрипт:
var Width = activeDocument.width.value;
var Height = activeDocument.height.value;
activeDocument.selection.select([[0,0],[Width,0],[Width,Height],[0,Height]], SelectionType.REPLACE, Math.max(Width,Height)/10, true);
var fillColor = new SolidColor;
fillColor.rgb.hexValue = '000000';
activeDocument.selection.fill(fillColor, ColorBlendMode.NORMAL, 100, false );
activeDocument.selection.deselect();
Здесь добавлены выделение прямоугольника (по координатам четырёх углов), растушёвка и заливка чёрным цветом. На данный момент мне не понятно, как сказать скрипту, что выделение должно быть эллиптическим. Этого я не нашёл ни в мануале, ни в интернете.
Пришлось применить несколько иную стратегию: я взял файл "\Program Files\Adobe\Adobe Photoshop CS4\Scripting\Utilities\ScriptListener.8li" и скопировал его в "\Program Files\Adobe\Adobe Photoshop CS4\Plug-ins\Automate\". Теперь все мои действия записываются в два файла на рабочем столе: "ScriptingListenerJS.log" и "ScriptingListenerVB.log". Затем создал документ размером, скажем, 500х300 пикселей и сделал нужное эллиптическое выделение.
Последняя операция (эллиптическое выделение) в JS-файле выглядит так:
var idsetd = charIDToTypeID( "setd" );
var desc42 = new ActionDescriptor();
var idnull = charIDToTypeID( "null" );
var ref13 = new ActionReference();
var idChnl = charIDToTypeID( "Chnl" );
var idfsel = charIDToTypeID( "fsel" );
ref13.putProperty( idChnl, idfsel );
desc42.putReference( idnull, ref13 );
var idT = charIDToTypeID( "T " );
var desc43 = new ActionDescriptor();
var idTop = charIDToTypeID( "Top " );
var idPxl = charIDToTypeID( "#Pxl" );
desc43.putUnitDouble( idTop, idPxl, 0.000000 );
var idLeft = charIDToTypeID( "Left" );
var idPxl = charIDToTypeID( "#Pxl" );
desc43.putUnitDouble( idLeft, idPxl, 0.000000 );
var idBtom = charIDToTypeID( "Btom" );
var idPxl = charIDToTypeID( "#Pxl" );
desc43.putUnitDouble( idBtom, idPxl, 300.000000 );
var idRght = charIDToTypeID( "Rght" );
var idPxl = charIDToTypeID( "#Pxl" );
desc43.putUnitDouble( idRght, idPxl, 500.000000 );
var idElps = charIDToTypeID( "Elps" );
desc42.putObject( idT, idElps, desc43 );
executeAction( idsetd, desc42, DialogModes.NO );
Очевидно, для выполнения универсальной задачи необходимо заменить "300" и "500" на размеры текущего документа:
desc43.putUnitDouble( idBtom, idPxl, activeDocument.height.value );
desc43.putUnitDouble( idRght, idPxl, activeDocument.width.value );
Аналогично можно поступить со скриптом на VisualBasic, если кому так больше нравится.
Конечно, выглядит не так красиво, как app.activeDocument.selection.select(), но зато даёт результат.
Таким образом, этот скрипт создаёт эллиптическое выделение на весь документ независимо от его размеров.
Всё остальное делается по образу и подобию. Запуск скрипта замечательно вписывается в Action.
Полезные ссылки:
http://www.adobeforums.com/http://www.ps-scripts.com/ Upd Вот
тут и
тут пришли к такому же решению, как у меня - через ScriptListener.
Upd Как делать закруглённые уголки:
http://meridium.livejournal.com/165361.html?thread=550641#t550641