Бестолковая страница
 
Скрипты для Photoshop. Уменьшение размера кадра.

Займемся уменьшением размера фотографии до формата пригодного для размещения в сети. Надоело каждый раз вызывать окно Image Resize и забивать цифры в окошках? Теоретически, это же можно сделать при помощи соответствующего Action. Вот, только максимум чего можно будет достичь - изменения размера до заданного по одному измерению, что неудобно если среди обрабатываемых фотографий попадаются и вертикальные и горизонтальные. Мы же ограничим размер и по ширине и по высоте.

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

Как обычно, определяем активный документ. Он, естественно, предполагается открытым. Сохраняются настройки и задаются единицы измерения - пикселы. Сохраняем в переменных размеры картинки. Задаем разрешение. Определяем ограничения по горизонтали и вертикали по умолчанию, например, 699 на 599 точек. Определяем коэффициент соотношения сторон. Главное, помнить, что ширина и высота это объекты, а вовсе не целочисленные переменные и для использования их в выражениях из них нужно добыть значение функцией parseInt().

var docRef = app.activeDocument;
var strtRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
 
var docHeight = docRef.height;
var docWidth = docRef.width;
var docResolution = 400.0;
 
var MaxWidth = 699;
var MaxHeight = 599;
 
var coeffH = parseInt(docWidth) / parseInt(docHeight);
var coeffW = parseInt(docHeight) / parseInt(docWidth);

Сама функция изменения размера кадра. Точнее, уменьшения до заданных размеров. Проверяем, что кадр нуждается в уменьшении. Так как нужно уложиться в заданные границы, для широких кадров итоговый размер определяет ограничение по ширине, для узких, соответственно, по длине. Шаг за шагом меняем размер, либо простой бикубической интреполяцией (переменная Method равно ResampleMethod.BICUBIC), либо с автоматическим усилением резкости на каждом шаге итерации (ResampleMethod.BICUBICSHARPER).

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

function ResizeStepByStep (MaxWidth, MaxHeight, Method) {
 
if ((docWidth > MaxWidth) || (docHeight > MaxHeight))
{

var Ratio = MaxWidth / MaxHeight;

if (coeffH > Ratio)
{
var stepWidth = parseInt(docWidth) * 0.2;
var tmpWidth = parseInt(docWidth) - stepWidth;

while (tmpWidth > (MaxWidth + 1))
{
docHeight = coeffW * tmpWidth;
docWidth = tmpWidth;
docRef.resizeImage(docWidth, docHeight, docResolution, Method);
tmpWidth = tmpWidth - stepWidth;
}
docHeight = coeffW * MaxWidth;
docWidth = MaxWidth;
}
if (coeffH <= Ratio)
{
var stepHeight = parseInt(docHeight) * 0.2;
var tmpHeight = parseInt(docHeight) - stepHeight;
while (tmpHeight > (MaxHeight + 1))
{
docWidth = coeffH * tmpHeight;
docHeight = tmpHeight;
docRef.resizeImage(docWidth, docHeight, docResolution, Method);
tmpHeight = tmpHeight - stepHeight;
}
docWidth = coeffH * MaxHeight;
docHeight = MaxHeight;
}
docRef.resizeImage(docWidth, docHeight, docResolution, Method);
}
}

Вызываем функцию изменения размера с ограничением 699 на 599 точек и усилением резкости, после чего сохраняем результат как jpeg. Возвращаемся в history к исходному изображению.

savedState = docRef.activeHistoryState;
// Resize to web with sharper
ResizeStepByStep(699, 599, ResampleMethod.BICUBICSHARPER);
SaveAsJPEG("_web", 6);
docRef.activeHistoryState = savedState;

Делаем небольшое изображение для preview. Ограничение размеров 300 на 300 точек. Не усиливаем резкость. На картинках небольшого размера это, как правило, излишне. Сохраняем в jpeg с качеством 3. Откатываемся к исходному изображению.

savedState = docRef.activeHistoryState;
// Resize to preview without sharper
ResizeStepByStep(300, 300, ResampleMethod.BICUBIC);
SaveAsJPEG("_small", 3);
docRef.activeHistoryState = savedState;

Закрываем исходный документ без изменений. Восстанавливаем настройки.

docRef.close(SaveOptions.DONOTSAVECHANGES);
app.preferences.rulerUnits = strtRulerUnits;
docRef = null;

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

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