火曜日, 3月 18, 2025

JavaScriptでAI遊び 38 
オブジェクトのRGB 2色間で色相グラデ作成

RGBモードで、オブジェクトの2色間で色相グラデーションを作成します。

function createRGBHueGradient() {
var doc = app.activeDocument;
var sel = doc.selection;

if (sel.length != 2) {
alert("2つのオブジェクトを選択してください。");
return;
}

var obj1 = sel[0];
var obj2 = sel[1];

if (!obj1.filled || !obj2.filled) {
alert("選択したオブジェクトには塗りが必要です。");
return;
}

var color1 = obj1.fillColor;
var color2 = obj2.fillColor;

if (!(color1.typename == "RGBColor" &&
        color2.typename == "RGBColor")) {
alert("RGBカラーのみ対応しています。");
return;
}

// ユーザーにステップ数を入力させる
var steps =
parseInt(prompt("グラデーションのステップ数を入力:", "10"), 10);
if (isNaN(steps) || steps < 1) {
alert("有効なステップ数を入力してください。");
return;
}

// RGB を HSB に変換
var hsb1 = rgbToHsb(color1.red, color1.green, color1.blue);
var hsb2 = rgbToHsb(color2.red, color2.green, color2.blue);

// 色相の補間
var deltaH = (hsb2[0] - hsb1[0]) / (steps + 1);
var deltaS = (hsb2[1] - hsb1[1]) / (steps + 1);
var deltaB = (hsb2[2] - hsb1[2]) / (steps + 1);

var startX = obj1.left;
var width = obj1.width;
var spacing = width + 10; // 配置間隔

for (var i = 1; i <= steps; i++) {
var newH = hsb1[0] + deltaH * i;
var newS = hsb1[1] + deltaS * i;
var newB = hsb1[2] + deltaB * i;

var rgb = hsbToRgb(newH, newS, newB);

var newColor = new RGBColor();
newColor.red = rgb[0];
newColor.green = rgb[1];
newColor.blue = rgb[2];

var newObj = obj1.duplicate();
newObj.left = startX + i * spacing;
newObj.fillColor = newColor;
}
}

// RGB から HSB に変換
function rgbToHsb(r, g, b) {
r /= 255;
g /= 255;
b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, v = max;

var d = max - min;
s = max == 0 ? 0 : d / max;

if (max == min) {
h = 0;
} else {
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}

return [h * 360, s * 100, v * 100];
}

// HSB から RGB に変換
function hsbToRgb(h, s, v) {
s /= 100;
v /= 100;
var c = v * s;
var x = c * (1 - Math.abs((h / 60) % 2 - 1));
var m = v - c;

var r, g, b;
if (h < 60) { r = c, g = x, b = 0; }
else if (h < 120) { r = x, g = c, b = 0; }
else if (h < 180) { r = 0, g = c, b = x; }
else if (h < 240) { r = 0, g = x, b = c; }
else if (h < 300) { r = x, g = 0, b = c; }
else { r = c, g = 0, b = x; }

return [(r + m) * 255, (g + m) * 255, (b + m) * 255];
}

createRGBHueGradient();

任意の2色のオブジェクトを選択して実行すると生成されるグラデーションの間隔を指定します。つまりグラデの数は「指定数-1」なので、10と指定すれば9になります。

上は処理結果です。下のグラデーションは、比較のためのブレンドによるグラデーション結果です。