Тень в Photoshop в зависимости от размера изображения

Я имею дело со многими тысячами psd-файлов, содержащих изображения продуктов. Большинство элементов были отделены от исходного фона и размещены на белом фоне. Они имеют очень небольшую тень, чтобы немного приподнять их над фоном. Теперь я переделываю их все (изначально квадратные изображения, но нужно 4:3) и хочу дать им одинаковые тени (в основном с помощью записанных действий). Я записал тень в действии (распространение X пикселей, расстояние X пикселей и т. д.).

Теперь проблема заключается в том, что размеры изображения варьируются от 1000 до 5000 пикселей. И если я применяю одну и ту же тень, она выглядит совсем по-другому на меньшем изображении по сравнению с большим.

То, что я ищу, - это способ создать тень не с расстоянием PIXEL, распространением и т. д., а с расстоянием в процентах и ​​т. д. Таким образом, я надеюсь добиться одинаковой кажущейся тени на всех изображениях. Я работал с PS много лет и искал в Интернете, но ничего подобного не нашел.

Есть ли способ добиться этого? Любая помощь будет оценена по достоинству.

Почему бы вам не создать действие для изменения размера изображения до заданного размера, а затем применить тень?
Я думал об этом. Но я не хочу уменьшать масштаб оригинала (который должен храниться в архиве). Преобразование всего в смарт-объект увеличило бы процесс на значительное время (как и уменьшение масштаба).
Если вы сделаете резервную копию своих исходных файлов, вы можете сделать, как говорит WELZ, и сохранить оригиналы в архиве.
это правда, не подумал об этом :) Если я настрою правильные действия, я могу воспроизвести это даже для отдельных изображений позже. В любом случае, не будет ли это классным дополнением к PS в будущем? ;)

Ответы (2)

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

Результат (первое изображение эталонное, 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()");
это отличный подход! Мне нужно больше заниматься написанием сценариев! Это будет делать то, что я хочу, в любом размере. Я попробую это завтра (мой часовой пояс скоро уходит в сон), но уже отметьте это как ответ :)
не мог дождаться. ;) это то, что я искал. Потрясающий! В качестве примечания: это добавляет тень и заменяет предыдущие (другие) эффекты слоя. В моем случае это нормально, просто чтобы другие знали. Спасибо
Да, этот метод заменяет существующие эффекты. Есть несколько способов избежать такого поведения, самый простой, вероятно, будет сначала сгруппировать слои (что может работать или нет, в зависимости от макета и эффектов).

Возможно, возвращаясь к старым временам, когда создание тени не было эффектом слоя.

При активном выборе изображения:

Действие:

  • Выберите слой «Фон»
  • Создайте слой-заливку > Черный, 100%
  • Преобразование текущего слоя> Используя верхнюю среднюю точку преобразования, масштабируйте 102% по вертикали и горизонтали.
  • Выберите канал маски
  • Размытие по Гауссу > 10 пикселей
  • Установить текущий слой > Режим = умножить
  • Установите текущий слой> Непрозрачность = 35%

Круг представляет собой файл размером 1000 X 1000.

введите описание изображения здесь

Прямоугольник — это файл размером 5000 X 600.

введите описание изображения здесь

Это ничем не отличается от добавления тени в качестве стиля слоя.
Отличие заключается в смещении тени не по пикселям, а по проценту масштабирования фигуры. Единственным пиксельным измерением является размытие.
Автор упомянул, что использует Shadow Distance, этот подход, к сожалению, будет работать только с простыми формами и с тенью непосредственно под слоем, я думаю
– к сожалению, этот подход будет работать только с простыми фигурами – Нет, с любым выделением. –С тенью прямо под слоем– Нет, поверх фона :-)
вы даже можете увидеть это в ваших примерах: на файле 5000x600 тень выглядит намного четче.
вот что я имею в виду под сложными формами: поскольку масштаб действует от центра слоя, если слой не является квадратом или кругом, тень не будет единой prntscr.com/kngxd6
@SergeyKritskiy Третий шаг именно для того, чтобы масштабирование было не от центра
Извините, я пропустил это. Это, однако, не меняет того факта, что тень не будет такой же, как падающая тень, и эффект будет более сильным на противоположном углу prntscr.com/kngzxe Но это частный случай. Извините за придирки, ужасная привычка
Не волнуйся, я как бы привык к этому. Здесь это очень распространенное поведение.