水曜日, 8月 20, 2025

JavaScriptでAI遊び 62 
Illustratorでカラー設定の色相を反転

特に目的は無いのですが、色相・彩度・明度の反転実験の色相版です。
CMYKでもRGBでも使えます。

#target illustrator

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

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

for (var i = 0; i < selection.length; i++) {
var obj = selection[i];

if (obj.typename === "PathItem") {
// 塗りの色を反転
if (obj.filled) {
obj.fillColor = invertColor(obj.fillColor);
}
// 線の色を反転
if (obj.stroked) {
obj.strokeColor = invertColor(obj.strokeColor);
}
}
}

alert("選択したオブジェクトの色相を反転しました。");
}

// 色を反転する関数
function invertColor(color) {
if (color.typename === "RGBColor") {
// RGBの色相を180度反転
// RGBカラーの場合:
        // 色相(Hue)を 180° 反転し、新しい RGB 値を設定
var hsb = rgbToHsb(color.red, color.green, color.blue);
hsb[0] = (hsb[0] + 180) % 360;
var invertedRgb = hsbToRgb(hsb[0], hsb[1], hsb[2]);

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

} else if (color.typename === "CMYKColor") {
// CMYKの色相を180度反転
// CMYKカラーの場合:
        // C, M, Y の値を 100 から引いて反転(黒 K は変更なし)
var newColor = new CMYKColor();
newColor.cyan = 100 - color.cyan;
newColor.magenta = 100 - color.magenta;
newColor.yellow = 100 - color.yellow;
newColor.black = color.black; // 黒(K)はそのまま保持
return newColor;
}

return color; // 変更なし
}

// 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 *= 60;
}
return [h, 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];
}

// スクリプト実行
invertHue();

左からCMYKで・・・
ベースチャート、カラー反転、カラー反転を2回実行

左からCMYKで・・・
ベースチャート、色相反転、色相反転を2回実行

左からRGBで・・・
ベースチャート、カラー反転、カラー反転を2回実行

左からRGBで・・・
ベースチャート、色相反転、色相反転を2回実行