Как повторить градиент несколько раз в Illustrator и Photoshop?

Как повторить градиент «n» раз, например, повторив градиент от черного к белому 5 раз (по пути штриха), как я сделал вручную в приведенном ниже примере изображения.

Есть ли способ автоматизировать его для умножения в n раз, например, в 50 или 100, без ручного копирования ползунка градиента?

Градиент повторяется несколько раз вручную

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

Ответы (6)

Используйте сценарии!

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

Чтобы использовать его, выберите 2 или более путей, заполненных цветами, предназначенными для градиента, а затем при появлении запроса введите количество повторений градиента.

http://pastie.org/10924009

Редактировать : сайт пасти не работает, поэтому я включил код ниже:

// select two paths, then run this script
if (app.activeDocument.selection.length < 2) {

    alert("Please select two or more paths with fills.");

} else {

    var cycles = Number(prompt ("Repeat the gradient how many times?")) || 5;  
    var myselection = app.activeDocument.selection;
    var colors = [];

    for (var i = 0; i < myselection.length; i++) {
        var newColor = myselection[i].fillColor;
        colors.push(newColor);
    }

    var stops = colors.length * cycles - 1; // “stops” does not include default 2 stops
    var interval = 100 / (cycles * colors.length); // ... the distance between stops

    var newGradient = app.activeDocument.gradients.add();  

    newGradient.type = GradientType.LINEAR;     // asymmetric, for 3 or more colours
    //newGradient.type = GradientType.RADIAL;   // symetric, for 3 or more colours

    //  the default 2 gradient stops (at beginning and end)
    //  should be the same colour, so that the gradient smoothly wraps around:
    newGradient.gradientStops[0].color = colors[0]; 
    newGradient.gradientStops[1].color = colors[0]; 

    // now add stops between beginning and end stops:
    for ( i = 1; i <= stops; i++ ) {

        var thisStop = newGradient.gradientStops.add();
        thisStop.rampPoint = i * interval;
        thisStop.color = colors[i % colors.length];

    }

    // to get a even result, the first and last rampPoints cannot be 0 and 100:
    newGradient.gradientStops[0].rampPoint = 0.1;
    newGradient.gradientStops[stops + 1].rampPoint = 99.9;
}

Пример 1: черно-белый, повторяется 6 раз, документ CMYK:

пример 1

Пример 2: 3 цветовых градиента, 6 повторов:

пример 2

Пример 3: документ RGB, 6 цветов, 20 повторений. Заметили, как закрашенные пути перекрываются? Этот порядок наложения (спереди назад) определяет порядок цветов в градиенте.

пример 3

Изменение цветов в градиенте . Выберите контур с примененным градиентом, затем выберите всплывающее меню панели «Образцы» → «Добавить выбранные цвета». Новые глобальные образцы будут добавлены на панель образцов, и когда вы редактируете один из них, он обновляется везде, где появляется.

пример 4

Очень хорошо. Мне нравится тот факт, что вы получаете цвета из выбора. Не думал об этом.
Потрясающий! Но ссылка paste.org не работает. Пожалуйста, проверьте и обновите.
@Vishnu: кажется, что весь сервер пирожных не работает. Я предполагаю, что вам просто нужно немного терпения, пока он не вернется снова.

Вы можете добиться этого с помощью сценариев Illustrator. Проверка документации для CC15.3 в справочном PDF-файле JavaScript в разделе «Градиенты» на странице 68.

Создайте цвета:

// Create the colors
var startColor = new RGBColor();  
startColor.red = 0;  
startColor.green = 100;  
startColor.blue = 255;  

var middleColor = new RGBColor();
middleColor.red = 252;  
middleColor.green = 238;  
middleColor.blue = 33;

var endColor = new RGBColor();  
endColor.red = 220;  
endColor.green = 0;  
endColor.blue = 100;  

Создайте градиент:

var newGradient = app.activeDocument.gradients.add();  
newGradient.name = "new_gradient_75097";  

Создайте линейный градиент:

newGradient.type = GradientType.LINEAR;  

или Создайте радиальный градиент:

newGradient.type = GradientType.RADIAL; 

Там, где вы хотели бы построить несколько типов градиента, было бы в GradientStops:

// Modify the first gradient stop  
newGradient.gradientStops[0].rampPoint = 0  
newGradient.gradientStops[0].midPoint = 20;  
newGradient.gradientStops[0].color = startColor;  
// Modify the middle gradient stop  
newGradient.gradientStops.add();
// Modify the last gradient stop  
newGradient.gradientStops[1].rampPoint = 70;  
newGradient.gradientStops[1].midPoint = 80;  
newGradient.gradientStops[1].color = endColor;

Приношу свои извинения, было отмечено, что я не полностью объяснил, как можно создать градиент n раз, поэтому я дополнительно изменил сценарий, включив подсказку и цикл.

Назовите количество раз:

var countgradient = Number(prompt ("Enter Gradient Count"));  

Создайте цикл и далее добавьте количество градиентов:

for ( i =0; i < countgradient; i++ ) {
    var origCount = newGradient.gradientStops.length;
    var lastStop = newGradient.gradientStops[origCount-1];

    var firstStop = newGradient.gradientStops.add();
    firstStop.rampPoint = lastStop.rampPoint;
    lastStop.rampPoint = lastStop.rampPoint - 1;
    firstStop.color = endColor;

    var secondStop = newGradient.gradientStops.add();
    secondStop.rampPoint = lastStop.rampPoint;
    lastStop.rampPoint = lastStop.rampPoint - 2;
    secondStop.color = startColor;
}

Код выше смесь того, что на странице 65-71 по ссылке вверху:

Пример с 1 разом:

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

Пример с 5 раз:

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

Вы можете изменить lastStop.rampPoint - n, чтобы настроить, где они приземляются. Надеюсь это поможет.

Это будет работать, только если вы используете градиент в качестве штриха (как в вашем вопросе). Если вы хотите повторять градиент бесконечно (в отличие от определенного количества повторений), вы можете пропустить шаги 2 и 3 и использовать узорчатую кисть вместо художественной кисти. В CC теперь вы можете использовать изображения в кистях, поэтому вы можете растеризовать градиент вместо его расширения, но я использую CS6, поэтому я не могу это проверить.

  1. Настройте один прямоугольник, заполненный градиентом, который вы хотите повторить.

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

  1. Используйте эффект трансформации ( Эффект → Исказить и трансформировать → Трансформировать... ), чтобы продублировать прямоугольник. Установите горизонтальное перемещение на ширину вашего прямоугольника и установите столько копий, сколько вам нужно.

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

  1. Разверните эффект трансформации ( Object → Expand Appearance ).

  2. Вы не можете использовать градиенты в кистях, поэтому вам нужно будет расширить градиент ( Object → Expand ), выбрать количество объектов для расширения в разделе «Expand Gradient To».

    Расширение градиента оставит вас с некоторыми обтравочными масками в расширенном градиенте, вам нужно будет просмотреть слои и удалить их (или продолжайте щелкать правой кнопкой мыши и «Разгруппировать», затем «Отпустить обтравочную маску», пока не будет больше масок).

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

  1. Перетащите расширенные градиенты на панель «Кисти» и выберите «Художественная кисть». Параметры по умолчанию для вашей кисти, скорее всего, будут в порядке, поэтому просто нажмите «ОК». Вы всегда можете вернуться и настроить параметры кисти позже.

  2. Примените новую кисть.

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

Основываясь на руководстве Illustrator JS, я придумал код ниже. Этот код делает именно то, что вы хотите:

  • Создает градиент с двумя точками цвета: черным и белым.
  • Повторяет это пять раз
  • Применяет его как обводку к активному (выбранному) элементу

Более общую версию можно найти ниже строки.

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

(1) Сначала мы устанавливаем желаемое количество цветов и желаемое количество повторений градиента:

//Change these
var numberOfColors = 2; //Change this to the desired number of colors in the gradient
var iteration = 5; //Change this to the desired times you want to repeat the gradient

(2) Затем мы устанавливаем некоторые переменные, которые будут использоваться позже. Вычисляет GradientIntervalпроцентное положение, в котором должна быть установлена ​​каждая точка. totalNumberofStopsдовольно очевиден. Массив colorsбудет использоваться позже.

//Don't change these
var i,j;
var gradientInterval = 100 / numberOfColors / iteration;
var totalNumberOfStops = numberOfColors * iteration;
var colors = [];

(3) Затем мы можем определить наши цвета. Вам нужно ровно столько цветов, сколько было задано в numberOfColorsначале. Отсутствующие цвета по умолчанию будут черными.

//Don't forget to push the colors to the colors array!

var color1 = new RGBColor();
color1.red = 0;
color1.green = 0;
color1.blue = 0;
colors.push(color1);

var color2 = new RGBColor();
color2.red = 255;
color2.green = 255;
color2.blue = 255;
colors.push(color2);

(4) Пришло время создать наш градиент и дать ему имя. Теперь мы также можем установить тип.

//Let's initiate the gradient & name it
var newGradient = app.activeDocument.gradients.add();
newGradient.name = "new_gradient";

//Choose the gradient type here
//newGradient.type = GradientType.RADIAL; //Uncomment the one you need
newGradient.type = GradientType.LINEAR; //Uncomment the one you need

(5) Теперь о хорошем. Сначала мы зациклимся, totalNumberOfStopsчтобы мы могли создать каждую точку и добавить ее в градиент. Создаем новую остановку и устанавливаем ее на одну дальше предыдущей. Теперь нам нужно получить правильный цвет из нашего массива цветов. Когда модуль индекса цикла, деленный на количество цветов, равен 0, мы знаем, что у нас были все цвета, и нам нужно начать заново, поэтому мы сбрасываем наш индекс цвета.

Пример Скажем, у меня есть шесть цветов, которые я хочу повторить 5 раз. У нас тридцать остановок. Мы перебираем все цвета, используя j. Когда jстановится 6, цветов больше нет (шесть — это седьмой цвет в массиве, но в массиве всего шесть цветов). Таким образом, каждый раз, кратный шести, мы снова начинаем с 0. В противном случае мы просто переходим к следующему цвету.

Теперь нам нужно только добавить окончательную цветовую остановку на 100%.

//Now here is where the magic starts
for(i=0;i<totalNumberOfStops;i++){
    var newStop = newGradient.gradientStops.add();
    newStop.rampPoint = i * gradientInterval;
    var modulus = i % numberOfColors;
    if(modulus === 0){
        j = 0;
    }else{
        j+=1;
    }
    newStop.color = colors[j];
}
var lastStop = newGradient.gradientStops.add();
lastStop.rampPoint = 100;
lastStop.color = colors[colors.length-1];

(6) Последний шаг: применение градиента к обводке. Сделанный. Партия!

//Apply gradient stroke to selected object
var colorOfGradient = new GradientColor();
colorOfGradient.gradient = newGradient;
var topPath = app.activeDocument.pathItems[0];
topPath.stroked = true;
topPath.strokeWidth = 140;
topPath.strokeColor =colorOfGradient;

(7) Возможно, вам придется вручную установить обводку «Применить градиент вдоль обводки», потому что я не нашел кода для этого.

градиентный штрих


Этот код был специально создан для вашего случая. Более общую версию можно найти здесь: http://pastie.org/10921740

Некоторые примеры:

Градиент с двумя цветами, повторяющийся дважды:введите описание изображения здесь

Градиент с пятью цветами, повторяющийся 10 раз:введите описание изображения здесь

Градиент с двумя цветами, повторяющийся 50 раз:введите описание изображения здесь

Огромный градиент с 50 цветами, повторяющимися 50 раз:введите описание изображения здесь

Этот сценарий хорош, за исключением того, что есть две дополнительные остановки градиента — одна в начале и одна в конце — которые не позволяют градиенту быть полностью бесшовным. Когда вы создаете градиент, по умолчанию есть две остановки.
Да Illustator всегда добавляет цветовую остановку на 100% при создании из скрипта, даже если вы ее не укажете. Но если вы его не укажете, будет установлен черный цвет. Мой обходной путь состоял в том, чтобы добавить дополнительную цветовую остановку на 100% с начальным цветом. Это не бесшовно, но это лучшее, что я мог придумать.
О нет, теперь я вижу, ссылка на пасти является более старой версией, я обновлю.

У меня была такая же проблема, и этот ответ от MG_ был именно тем, что мне было нужно!

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

var run = true;
if (app.activeDocument.selection.length < 2) {
    alert("Please select two or more paths with fills.");
} else {
    var dlg = new Window("dialog{text:'Create repeated gradient'}");

    dlg.location = [500,50];
    (dlg.alertBtnsPnl1 = dlg.add('panel', undefined, 'Color transition:')).helpTip = "Smooth or rough transition"; 
    (dlg.alertBtnsPnl1.selectS = dlg.alertBtnsPnl1.add('radiobutton', [15,15,95,35], 'Smooth' )).helpTip = "Smooth color transition"; 
    (dlg.alertBtnsPnl1.selectR = dlg.alertBtnsPnl1.add('radiobutton', [15,15,75,35], 'Rough' )).helpTip = "Sharp color transition"; 
    dlg.alertBtnsPnl1.orientation='row';
    dlg.alertBtnsPnl1.selectS.value = true;

    (dlg.alertBtnsPnl3 = dlg.add('panel', undefined, 'Gradient type:')).helpTip = "Linear or radial gradient"; 
    (dlg.alertBtnsPnl3.selectL = dlg.alertBtnsPnl3.add('radiobutton', [15,15,95,35], 'Linear' )).helpTip = "Linear gradient"; 
    (dlg.alertBtnsPnl3.selectR = dlg.alertBtnsPnl3.add('radiobutton', [15,15,75,35], 'Radial' )).helpTip = "Radial gradient"; 
    dlg.alertBtnsPnl3.orientation='row';
    dlg.alertBtnsPnl3.selectL.value = true;

    (dlg.alertBtnsPnl2 = dlg.add('panel', undefined, 'Gradient repeats:')).helpTip = "Gradient repeat count"; 
    (dlg.alertBtnsPnl2.slide = dlg.alertBtnsPnl2.add('slider', [25,15,165,39], 'Set repeat count for gradient:')).helpTip = "Use Slider to set a repeat count"; 
    dlg.alertBtnsPnl2.slide.value = 2; 
    (dlg.alertBtnsPnl2.titleEt = dlg.alertBtnsPnl2.add('edittext', [100,15,160,35], dlg.alertBtnsPnl2.slide.value)).helpTip = "Enter a repeat count value"; 
    dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.slide.value); 
    dlg.alertBtnsPnl2.orientation='row';

    (dlg.alertBtnsPnl4 = dlg.add('panel', undefined, 'First and last colors:')).helpTip = "Define type of gradient loop";
    (dlg.sameStartAndEnd = dlg.alertBtnsPnl4.add('checkbox', [25,25,235,39], 'Start and end with same color')).helpTip="Use this for seamless gradient"; 
    dlg.sameStartAndEnd.value = true; 
    dlg.alertBtnsPnl4.orientation='column';

    dlg.btnPnl = dlg.add('group', undefined, 'Do It!'); 
    dlg.btnPnl.orientation='row';
    dlg.btnPnl.buildBtn1= dlg.btnPnl.add('button',[15,15,115,35], 'Cancel', {name:'cancel'}); 
    dlg.btnPnl.buildBtn2 = dlg.btnPnl.add('button', [125,15,225,35], 'OK', {name:'ok'}); 
    dlg.alertBtnsPnl2.slide.onChange= sliderChanged;
    dlg.alertBtnsPnl2.titleEt.onChanging = eTextChanged;
    dlg.btnPnl.buildBtn1.onClick= actionCanceled;
    dlg.show();

    if(run){
        var smooth = (dlg.alertBtnsPnl1.selectS.value) ? true : false;
        var cycles = dlg.alertBtnsPnl2.slide.value;
        var myselection = app.activeDocument.selection;
        var colors = [];

        for (var i = 0; i < myselection.length; i++) {
            var newColor = myselection[i].fillColor;
            colors.push(newColor);
        }

        var stops;
        var interval;
        if(dlg.sameStartAndEnd.value && !smooth){
            stops = colors.length * cycles - 2;
            interval = 100 / ((cycles * colors.length)+1);
        }else{
            if(smooth && !dlg.sameStartAndEnd.value){
                stops = colors.length * cycles - 2;
                interval = 100 / ((cycles * colors.length)-1);
            }else{
                stops = colors.length * cycles - 1;
                interval = 100 / (cycles * colors.length);
            }
        }

        var allStops = stops;
        var newGradient = app.activeDocument.gradients.add();  

        newGradient.type = (dlg.alertBtnsPnl3.selectL.value) ? GradientType.LINEAR : GradientType.RADIAL;

        newGradient.gradientStops[0].color = colors[0]; 
        if(dlg.sameStartAndEnd.value) newGradient.gradientStops[1].color = colors[0]; 
        else newGradient.gradientStops[1].color = colors[colors.length - 1]; 

        if(!smooth){
            var thisStop = newGradient.gradientStops.add();
            thisStop.rampPoint = interval-0.1;
            thisStop.color = colors[0];
            allStops++;
        }

        for(i = 1; i <= stops; i++){
            var thisStop = newGradient.gradientStops.add();
            thisStop.rampPoint = i * interval;
            thisStop.color = colors[i % colors.length];

            if(!smooth && i<(stops+1)){
                var thisStop = newGradient.gradientStops.add();
                thisStop.rampPoint = (i+1) * interval - 0.001;
                thisStop.color = colors[i % colors.length];
                allStops++;
            }
        }

        if(!smooth && dlg.sameStartAndEnd.value){
            var thisStop = newGradient.gradientStops.add();
            thisStop.rampPoint = 100 - (interval*2);
            thisStop.color = colors[colors.length-1];
            allStops++;
            var thisStop = newGradient.gradientStops.add();
            thisStop.rampPoint = 99.9 - interval;
            thisStop.color = colors[colors.length-1];
            allStops++;
            var thisStop = newGradient.gradientStops.add();
            thisStop.rampPoint = 100 - interval;
            thisStop.color = colors[0];
            allStops++;
        }

        newGradient.gradientStops[0].rampPoint = 0.1;
        if(dlg.sameStartAndEnd.value)newGradient.gradientStops[allStops + 1].rampPoint = 99.9;
    }
}

function actionCanceled() { 
    run = false;
    dlg.hide();
}

function sliderChanged() { 
    dlg.alertBtnsPnl2.slide.value = Math.ceil(dlg.alertBtnsPnl2.slide.value);
    dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.slide.value);
}

function eTextChanged() { 
    dlg.alertBtnsPnl2.titleEt.text = Math.ceil(dlg.alertBtnsPnl2.titleEt.text);
    dlg.alertBtnsPnl2.slide.value = Math.ceil(dlg.alertBtnsPnl2.titleEt.text);
}

Так что в основном он работает так же, как ответ, который я связал, но имеет пару дополнительных опций:введите описание изображения здесь

Ну, я бы не стал использовать градиент полностью. Сначала создайте градиент, подобный тому, который у вас есть, затем заполните им холст и определите шаблон (редактировать > определить шаблон). Затем вы переходите к Слою. новый слой заливки и выберите узор. Вы можете использовать существующий слой в качестве обтравочной маски. Теперь «n» — это «масштаб», поэтому 100% — это 1, 50% — это n=2 и так далее. Чем меньше масштаб, тем более повторяемым будет узор и градиент.

Второй подход, который я бы выбрал, - это «шаг и повторение». Я не знаю, где и как вы хотите использовать этот множественный «волнистый» градиент, но «S&R» очень удобен для умножения вещей в фотошопе. Просто нажмите «ctrl (cmd) + alt + t», сделайте свое дело (масштабируйте, переместите, поверните объект), нажмите Enter, а затем используйте «shift + ctrl (cmd) + alt + t», и фотошоп повторит то, что вы сделали. Если вы вращаете, перемещаете и масштабируете объект, Ps будет делать это столько раз, сколько вы нажмете кнопку повтора.введите описание изображения здесь

Здесь я просто играл со вторым по величине конвертом, а затем повторил шаг.