Бестолковая страница
 
Скрипты для Photoshop. Сохранение в формате JPEG.

Обработанную фотографию рано или поздно надо сохранить. Если снимок предполагается вывесить где-нибудь в сети, самое логичное и правильное, уменьшив его до разумных пределов, нажать Ctrl-Shift-S или выбрать в меню пункт Files->Save for Web. Вне зависимости от того, в каком состоянии находится фотография, сколько слоев, какой цветовой режим, высветится заветное окошко, в котором можно будет выбрать тип и плотность сжатия, посмотреть какого размера получится файл.

И все бы хорошо, если не одно но. Функция "Save for Web", еще не так давно была отдельным плагином к Photoshop. Она ведет свой, отдельный образ жизни и не вызывается ни из Actions, ни из скриптов. Это значит, что нет возможности обработать сразу несколько файлов.

Можно использовать стандартную функцию "Save As", но и тут не все в порядке. Во-первых, перед сохранением нужно привести фотографию к совершенно определенному формату с цветовой схемой RGB, по пути избавившись от слоев. Во-вторых, пока файл не будет сохранен, нет возможности узнать его размер, это неудобно. В-третьих, в процессе сохранения к файлу будет прицеплена информация в EXIF формате, которая увеличит размер килобайт на двадцать.

Остается написать скрипт, который решит проблему.

Перво-наперво, определяем идентификатор открытого документа.

var docRef = app.activeDocument;

Описываем операцию сохранения в виде функции. Её параметры рассмотрим по мере использования. Destination - это путь к директории, где будет сохранен файл. TailName - довесок к имени, мало ли, вдруг пригодится. Формируем имя файла из текущего имени с полным путем с добавлением хвоста к имени и расширения ".jpg" .

function SaveAsJPEG (Destination, TailName, Quality, Limit) {

var FileName = docRef.name;
var OutputFileName = Destination + FileName;

var regex = /(.*)\.(.*)/;
var CorrectedName = regex.exec(OutputFileName);

OutputFileName = CorrectedName[1];
FullOutputFileName = OutputFileName + TailName + ".jpg";

 

Теперь надо привести документ в формат, в котором возможно сохранение в JPEG. Соединяем слои, преобразуем в RGB формат с восемью битами на цветовой канал.

docRef.flatten();

docRef.changeMode(ChangeMode.RGB);

docRef.bitsPerChannel = BitsPerChannelType.EIGHT;

Определяем опции результирующего JPEG файла. Отказываемся от встраивания ColorProfile. Выставялем качество изображения в значение Quality. Сохраняем файл как копию.

jpegFile = new File(FullOutputFileName);
jpegSaveOptions = new JPEGSaveOptions();
jpegSaveOptions.embedColorProfile = false;
jpegSaveOptions.quality = Quality;

docRef.saveAs(jpegFile, jpegSaveOptions, true, Extension.LOWERCASE);

jpegFile = null;

На этом можно было бы и остановиться, однако, хотелось бы иметь возможность ограничить размер результирующего файла. Считаем, что ограничение задано переменной Limit. Определяем размер только что сохраненного файла и, если он больше ограничения, уменьшаем качество Quality на одну ступеньку. Сохраняем снова и так далее, до приемлемого размера. Если будем избавляться от включения в файл EXIF информации, учитываем ее размер, в моем случае это около 19 килобайт.

if (typeof Limit == "undefined"){
// alert("Undefined Limit");
} else
{
jFile = new File(FullOutputFileName);
CurrentLength = jFile.length;
jFile = null;
while (CurrentLength > (Limit + 19000)){
Quality = Quality - 1;
jpegSaveOptions.quality = Quality;
docRef.saveAs(jpegFile, jpegSaveOptions, true, Extension.LOWERCASE);
jFile = new File(FullOutputFileName);
CurrentLength = jFile.length;
jFile = null;
}
}

}

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

В вызове функции в явном виде определяется путь в папку, куда будет складываться результат, в данном случае "C:\tmp\". К именам файлов будет добавлены хвостики "_copy". Качество сохранения будет не больше 10 (из 12), при этом файлы должны быть не больше 153600 байт, что соответствует 150 килобайтам.

// Save
savedState = docRef.activeHistoryState;
SaveAsJPEG("/с/tmp/", "_copy", 10, 153600);
docRef.activeHistoryState = savedState;

Сохраняем скрипт в файл. Например, savejpeg.js. Открываем в Photophop фотографию, которую нужно сохранить в jpeg формате. Находим файл со скриптом, выбирая File->Scripts->Browse, запускаем. Наслаждаемся результатом.

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

Ах да, еще нужно избавиться от EXIF информации. Для этого используем свободно распространяемую утилиту jpegtran, запускаемую с ключом -copy none. Найти ее можно, например, здесь.

© 2005, Павел aka P1at0.
liveinternet.ru: показано число посетителей за сегодня
Сайт управляется системой uCoz