木曜日, 4月 10, 2025

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

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

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

function interpolateColor(c1, c2, t) {
var color = new RGBColor();
color.red = c1.red + (c2.red - c1.red) * t;
color.green = c1.green + (c2.green - c1.green) * t;
color.blue = c1.blue + (c2.blue - c1.blue) * t;
return color;
}

function createGradientStepsScaled() {
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つのグラデーション塗りのオブジェクトを
            選択してください。");
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 =
            interpolateColor(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;
}
}

createGradientStepsScaled();


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


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


結果の配置位置は中心です。