日曜日, 4月 13, 2025

JavaScriptでAI遊び 42 
2色間のグラデを指定ステップ数の矩形に分割(CMYK)

2色間のグラデーションを指定ステップ数の矩形に分割します。CMYK版。グラデーションは2色間であれば線形、円形のどちらでも問題ありませんが、フリーグラデーションには未対応です。


function mmToPoints(mm) {
return mm * 2.83465; // 1 mm ≈ 2.83465 pt
}

function interpolateCMYK(c1, c2, t) {
var color = new CMYKColor();
color.cyan = c1.cyan + (c2.cyan - c1.cyan) * t;
color.magenta = c1.magenta + (c2.magenta - c1.magenta) * t;
color.yellow = c1.yellow + (c2.yellow - c1.yellow) * t;
color.black = c1.black + (c2.black - c1.black) * t;
return color;
}

function createCMYKGradientStepsScaled() {
if (app.documents.length === 0) {
alert("ドキュメントを開いてください。");
return;
}

var doc = app.activeDocument;
var selection = doc.selection;

if (selection.length !== 1 || selection[0].typename !==
        "PathItem" || !selection[0].filled || selection[0].
        fillColor.typename !== "GradientColor") {
alert("1つのCMYKグラデーション塗りのオブジェクトを
            選択してください。");
return;
}

var gradient = selection[0].fillColor.gradient;
if (gradient.gradientStops.length < 2) {
alert("グラデーションに2つ以上の色が必要です。");
return;
}

var steps = parseInt(prompt("分割するステップ数を入力:", "10"), 10);
if (isNaN(steps) || steps < 2) {
alert("2以上の整数を入力してください。");
return;
}

var totalWidthMM =
        parseFloat(prompt("全体の幅(mm)を入力:", "100"));
var totalHeightMM =
        parseFloat(prompt("全体の高さ(mm)を入力:", "50"));

if (isNaN(totalWidthMM) || isNaN(totalHeightMM) ||
        totalWidthMM <= 0 || totalHeightMM <= 0) {
alert("正しい数値を入力してください。");
return;
}

var totalWidth = mmToPoints(totalWidthMM);
var totalHeight = mmToPoints(totalHeightMM);

var rectWidth = totalWidth / steps;
var rectHeight = totalHeight;

var artboard =
        doc.artboards[doc.artboards.getActiveArtboardIndex()];
var artboardBounds = artboard.artboardRect;
var centerX = (artboardBounds[0] + artboardBounds[2]) / 2;
var centerY = (artboardBounds[1] + artboardBounds[3]) / 2;

var startX = centerX - totalWidth / 2;
var startY = centerY + totalHeight / 2;

for (var i = 0; i < steps; i++) {
var t = i / (steps - 1);

// グラデーションストップ間の色を計算
var lowerIndex = 0;
var upperIndex = gradient.gradientStops.length - 1;
for (var j = 0; j < gradient.gradientStops.length - 1; j++) {
if (t >= gradient.gradientStops[j].rampPoint / 100 && t <=
                gradient.gradientStops[j + 1].rampPoint / 100) {
lowerIndex = j;
upperIndex = j + 1;
break;
}
}

var tLerp =
            (t - gradient.gradientStops[lowerIndex].rampPoint / 100) /
((gradient.gradientStops[upperIndex].rampPoint / 100) -
                    (gradient.gradientStops[lowerIndex].rampPoint / 100));
var fillColor =
            interpolateCMYK(gradient.gradientStops[lowerIndex].color,
            gradient.gradientStops[upperIndex].color, tLerp);

var rect = doc.pathItems.rectangle(startY, startX + i *
            rectWidth, rectWidth, rectHeight);
rect.filled = true;
rect.fillColor = fillColor;
rect.stroked = false;
}
}

createCMYKGradientStepsScaled();

グラデーションを設定したオブジェクトを選択して実行すると・・・

サイズとステップ数を指定します。サイズは全体のサイズになります。

結果の配置は中央です。