Я имею дело со многими тысячами psd-файлов, содержащих изображения продуктов. Большинство элементов были отделены от исходного фона и размещены на белом фоне. Они имеют очень небольшую тень, чтобы немного приподнять их над фоном. Теперь я переделываю их все (изначально квадратные изображения, но нужно 4:3) и хочу дать им одинаковые тени (в основном с помощью записанных действий). Я записал тень в действии (распространение X пикселей, расстояние X пикселей и т. д.).
Теперь проблема заключается в том, что размеры изображения варьируются от 1000 до 5000 пикселей. И если я применяю одну и ту же тень, она выглядит совсем по-другому на меньшем изображении по сравнению с большим.
То, что я ищу, - это способ создать тень не с расстоянием PIXEL, распространением и т. д., а с расстоянием в процентах и т. д. Таким образом, я надеюсь добиться одинаковой кажущейся тени на всех изображениях. Я работал с PS много лет и искал в Интернете, но ничего подобного не нашел.
Есть ли способ добиться этого? Любая помощь будет оценена по достоинству.
Вот как я подхожу к этому со сценариями. Сначала я определяю эталонную тень и эталонный размер, затем, если ширина изображения не совпадает с эталонным размером, я линейно преобразовываю значения тени на основе соотношения текущей ширины изображения и эталонной ширины.
Результат (первое изображение эталонное, 1000х1000, второе 2000х2000, третье 660х600, четвертое 200х200):
Поскольку Photoshop не поддерживает десятичные знаки в эффекте тени, результаты между ними будут не совсем одинаковыми, но достаточно близкими.
Таким образом, вы можете добавить этот скрипт в качестве одного из шагов действия:
function main()
{
var myShadow = {
color:
{
r: 0,
g: 0,
b: 0,
},
opacity: 80,
angle: 120,
distance: 10,
spread: 0,
size: 20,
},
referenceSize = 1000,
doc = activeDocument,
w = doc.width.as("px"),
h = doc.height.as("px");
if (w != referenceSize)
{
var ratio = w/referenceSize;
myShadow.distance = linear(ratio,0,1,0,myShadow.distance);
myShadow.spread = linear(ratio,0,1,0,myShadow.spread);
myShadow.size = linear(ratio,0,1,0,myShadow.size);
}
dropShadow(myShadow);
/////////////////////////////////////////////////////////////////////////////////////
function dropShadow(shadow)
{
var desc10 = new ActionDescriptor();
var ref1 = new ActionReference();
ref1.putProperty(cTID('Prpr'), cTID('Lefx'));
ref1.putEnumerated(cTID('Lyr '), cTID('Ordn'), cTID('Trgt'));
desc10.putReference(cTID('null'), ref1);
var desc11 = new ActionDescriptor();
desc11.putUnitDouble(cTID('Scl '), cTID('#Prc'), 100);
var desc12 = new ActionDescriptor();
desc12.putBoolean(cTID('enab'), true);
desc12.putBoolean(sTID('present'), true);
desc12.putBoolean(sTID('showInDialog'), true);
desc12.putEnumerated(cTID('Md '), cTID('BlnM'), cTID('Nrml'));
var desc13 = new ActionDescriptor();
desc13.putDouble(cTID('Rd '), shadow.color.r);
desc13.putDouble(cTID('Grn '), shadow.color.g);
desc13.putDouble(cTID('Bl '), shadow.color.b);
desc12.putObject(cTID('Clr '), cTID('RGBC'), desc13);
desc12.putUnitDouble(cTID('Opct'), cTID('#Prc'), shadow.opacity);
desc12.putBoolean(cTID('uglg'), false);
desc12.putUnitDouble(cTID('lagl'), cTID('#Ang'), shadow.angle);
desc12.putUnitDouble(cTID('Dstn'), cTID('#Pxl'), shadow.distance);
desc12.putUnitDouble(cTID('Ckmt'), cTID('#Pxl'), shadow.spread);
desc12.putUnitDouble(cTID('blur'), cTID('#Pxl'), shadow.size);
desc12.putUnitDouble(cTID('Nose'), cTID('#Prc'), 0.000000);
desc12.putBoolean(cTID('AntA'), false);
var desc14 = new ActionDescriptor();
desc14.putString(cTID('Nm '), "Linear");
desc12.putObject(cTID('TrnS'), cTID('ShpC'), desc14);
desc12.putBoolean(sTID('layerConceals'), true);
desc11.putObject(cTID('DrSh'), cTID('DrSh'), desc12);
desc10.putObject(cTID('T '), cTID('Lefx'), desc11);
executeAction(cTID('setd'), desc10, DialogModes.NO);
};
function linear(X, A, B, C, D, _cut)
{
var _cut = _cut !== undefined ? _cut : false;
var Y = (X - A) / (B - A) * (D - C) + C
if (_cut)
{
Y > D && Y = D;
Y < C && Y = C;
};
return Y
};
function cTID(s)
{
return app.charIDToTypeID(s);
};
function sTID(s)
{
return app.stringIDToTypeID(s);
};
}
app.activeDocument.suspendHistory("addShadow", "main()");
Возможно, возвращаясь к старым временам, когда создание тени не было эффектом слоя.
При активном выборе изображения:
Действие:
Круг представляет собой файл размером 1000 X 1000.
Прямоугольник — это файл размером 5000 X 600.
Вельц
Энгл
Электрон
Энгл