Adobe StockなどのRGBイラスト素材をCMYK変換すると、カラーパネルには「C:23.47 M:67.82 Y:12.35 K:1.18」のような小数点付きの数値が並びます。
illustratorのデータ上は、小数点以下の数値も扱えます。
実際の印刷では小数点の部分の細かい指定は切り捨てられます(または四捨五入)が、稀に思わぬ色変化が起きることもあります。
デザインする側としても気持ちのいいデータとも言えませんよね。
かといって、オブジェクトを1つずつ選択して値を丸めるのは現実的ではなく、グラデーションのストップ値まで手動で直すとなると、それだけで数十分かかることもあります。
この記事では、選択したオブジェクトのCMYKカラーを一括で5%刻みに丸めるillustratorスクリプト(.jsx)を紹介・配布します。また、導入手順・動かないケースの原因と対処法も解説します。
RGBからCMYK変換後の小数点カラー値は、スクリプトで一括整理できる
ストック素材のCMYK変換で起きる「小数点問題」
Adobe Stockやフリー素材サイトで配布されているベクターイラスト素材の多くは、RGBモードで作成されています。
これをillustratorで開き「ファイル > ドキュメントのカラーモード > CMYK」で変換すると、カラー値はRGBからCMYKへ自動で再計算されます。
再計算後の値はほぼ確実に小数点付きの中途半端な数値になります。
たとえば、元のRGB値が「R:255 G:200 B:0」だった場合、CMYK変換後は「C:0 M:21.57 Y:100 K:0」のような値になります。
オブジェクトが数十個、さらにグラデーションが含まれていれば、手動での修正は現実的ではありません。
yama↑↑↑
こんな画像を1つ1つ修正するのは大変です(汗)
このスクリプトがやること ── 全CMYKカラーを5%刻みに丸める
今回配布するスクリプト(RoundCMYKto5PercentFloor_v2.jsx)は、選択したオブジェクトに含まれるすべてのCMYKカラー値を、小数点以下を切り捨て5%刻みに丸めます。
処理の具体例は以下の通りです。
| 変換前 | 変換後 |
|---|
| C:23.47 | C:20 |
| M:67.82 | M:65 |
| Y:12.35 | Y:10 |
| K:1.18 | K:0 |
処理対象は単色の塗り・線だけではありません。
グラデーションの各ストップ値、特色(SpotColor)のtint値も含めて一括で処理されます。
変換したいオブジェクトを選択してスクリプトを実行するだけで、CMYKカラーがきれいな5%刻みの値に揃います。
yama5%刻みのカラー指定は印刷では割と多い指定方法です。
スポンサーリンク
CMYKを5%刻みにするスクリプトのダウンロード
スクリプトファイルをダウンロード後に展開、任意の場所に保存します。
利用にあたっての注意事項
- 本スクリプトはAdobe Illustrator CC 2024で動作検証を行っています。他のバージョンでは正常に動作しない場合があります。
- スクリプトの使用によって生じたデータの破損・不具合・その他一切の損害について、当サイトは責任を負いかねます。実行前に必ず元データのバックアップを取った上でご利用ください。
- 個別のサポート・カスタマイズ対応は行っておりません。
- スクリプトのコードを見る(クリックで展開)
-
/*
RoundCMYKto5PercentFloor_v2.jsx
--------------------------------
選択オブジェクト内のCMYKカラーを
「小数点以下切り捨て → 5%刻みに丸め」するスクリプト。
対応範囲:
- パスアイテムの塗り/線(単色・グラデーション両対応)
- CompoundPathItem内のパス
- グループ/クリッピングマスク内のオブジェクト(再帰処理)
- SpotColor(特色)のtint値
テキストについて:
- テキストツールで直接設定した文字色は処理可能ですが、
実務で標準的な「フレームレベルのアピアランス追加(塗りを線の上に配置)」
で設定した色は ExtendScript API の制約により処理できません。
- テキスト部分は「アウトライン化」してからスクリプトを実行してください。
ブレンドについて:
- ブレンドオブジェクト(PluginItem)は内部パスにアクセスできません。
スクリプト実行後、未処理のブレンドが選択状態で残ります。
- 「オブジェクト > ブレンド > 拡張」で展開後、再度スクリプトを実行してください。
- ※「分割・拡張」はグラデーションも分解するため使わないでください。
その他の制限事項:
- シンボル内のアートは未対応(リンク解除後に処理)
- パターンスウォッチ内の色は未対応
推奨ワークフロー:
1. RGBファイルを開き、ドキュメントをCMYKモードに変換(手動)
2. テキストをアウトライン化
3. 全オブジェクトを選択しスクリプト実行
4. ブレンドが残った場合 → 選択状態のまま「ブレンド > 拡張」→ 再実行
動作確認:Illustrator CC2024
*/
(function () {
// =====================================================================
// 前提チェック
// =====================================================================
if (app.documents.length === 0) {
alert("ドキュメントが開かれていません。");
return;
}
var doc = app.activeDocument;
if (doc.documentColorSpace !== DocumentColorSpace.CMYK) {
alert("ドキュメントがCMYKモードではありません。\n"
+ "「ファイル > ドキュメントのカラーモード > CMYK」で変換してから実行してください。");
return;
}
var sel = doc.selection;
if (!sel || sel.length === 0) {
alert("オブジェクトが選択されていません。\n処理したいオブジェクトを選択してから実行してください。");
return;
}
// =====================================================================
// ユーティリティ:5%刻みに丸める(切り捨て)
// =====================================================================
function roundTo5Floor(val) {
// 0-100の範囲にクランプしてから処理
val = Math.max(0, Math.min(100, val));
return Math.floor(val / 5) * 5;
}
// =====================================================================
// CMYKColor を丸めた新しい CMYKColor を返す
// =====================================================================
function roundCMYK(cmykColor) {
var newC = new CMYKColor();
newC.cyan = roundTo5Floor(cmykColor.cyan);
newC.magenta = roundTo5Floor(cmykColor.magenta);
newC.yellow = roundTo5Floor(cmykColor.yellow);
newC.black = roundTo5Floor(cmykColor.black);
return newC;
}
// =====================================================================
// カラーオブジェクトを処理して丸めた新しいカラーを返す
// 対応型:CMYKColor, GradientColor, SpotColor
// 変更不要の場合は null を返す
// =====================================================================
function processColor(colorObj) {
if (!colorObj || !colorObj.typename) return null;
switch (colorObj.typename) {
case "CMYKColor":
return roundCMYK(colorObj);
case "GradientColor":
// GradientColor内の各ストップを処理
var grad = colorObj.gradient;
var stops = grad.gradientStops;
for (var s = 0; s < stops.length; s++) {
var stopColor = stops[s].color;
if (stopColor.typename === "CMYKColor") {
stops[s].color = roundCMYK(stopColor);
} else if (stopColor.typename === "SpotColor") {
// SpotColorのtintも5%刻みに
stopColor.tint = roundTo5Floor(stopColor.tint);
}
}
// GradientColorはstopsを直接変更済みなのでそのまま返す
return colorObj;
case "SpotColor":
// 特色のtint値を5%刻みに丸める
var newSpot = new SpotColor();
newSpot.spot = colorObj.spot;
newSpot.tint = roundTo5Floor(colorObj.tint);
return newSpot;
default:
// RGBColor, GrayColor, PatternColor, NoColor 等は処理しない
return null;
}
}
// =====================================================================
// パスアイテムの塗り・線を処理
// =====================================================================
function processPathItem(pItem) {
// 塗り — filled フラグに依存せず、fillColor の型を直接チェック
try {
var fc = pItem.fillColor;
if (fc && fc.typename && fc.typename !== "NoColor") {
var newFill = processColor(fc);
if (newFill !== null) {
pItem.fillColor = newFill;
}
}
} catch (e) { /* fillColor 取得不可の場合はスキップ */ }
// 線 — stroked フラグに依存せず、strokeColor の型を直接チェック
try {
var sc = pItem.strokeColor;
if (sc && sc.typename && sc.typename !== "NoColor") {
var newStroke = processColor(sc);
if (newStroke !== null) {
pItem.strokeColor = newStroke;
}
}
} catch (e) { /* strokeColor 取得不可の場合はスキップ */ }
}
// =====================================================================
// テキストフレームを処理
// - フレーム自体のオブジェクト属性(選択ツールで設定したアピアランス)
// - 文字単位の属性(テキストツールで設定した文字色)
// 両方を処理する
// =====================================================================
function processTextFrame(tFrame) {
// ----- A) テキストフレーム自体のオブジェクト属性 -----
// 選択ツールでアピアランスパネルから設定した塗り・線はここに入る
try {
var frameFill = tFrame.fillColor;
if (frameFill && frameFill.typename && frameFill.typename !== "NoColor") {
var newFrameFill = processColor(frameFill);
if (newFrameFill !== null) {
tFrame.fillColor = newFrameFill;
}
}
} catch (e) { /* フレームのfillColor取得不可の場合はスキップ */ }
try {
var frameStroke = tFrame.strokeColor;
if (frameStroke && frameStroke.typename && frameStroke.typename !== "NoColor") {
var newFrameStroke = processColor(frameStroke);
if (newFrameStroke !== null) {
tFrame.strokeColor = newFrameStroke;
}
}
} catch (e) { /* フレームのstrokeColor取得不可の場合はスキップ */ }
// ----- B) 文字単位の属性 -----
// テキストツールで個別に設定した文字色はここに入る
var chars = tFrame.textRange.characters;
for (var c = 0; c < chars.length; c++) {
var charAttr = chars[c].characterAttributes;
// 塗り
try {
var charFill = charAttr.fillColor;
if (charFill && charFill.typename) {
var newFill = processColor(charFill);
if (newFill !== null) {
charAttr.fillColor = newFill;
}
}
} catch (e) { /* fillColorが取得できない場合はスキップ */ }
// 線
try {
var charStroke = charAttr.strokeColor;
if (charStroke && charStroke.typename) {
var newStroke = processColor(charStroke);
if (newStroke !== null) {
charAttr.strokeColor = newStroke;
}
}
} catch (e) { /* strokeColorが取得できない場合はスキップ */ }
}
}
// =====================================================================
// スキップされたオブジェクトの収集
// =====================================================================
var skippedPluginItems = []; // ブレンド・エンベロープ・3D効果等
var skippedSymbolItems = []; // シンボルインスタンス
// =====================================================================
// 選択アイテムを再帰的に処理
// =====================================================================
function processItem(item) {
switch (item.typename) {
case "PathItem":
processPathItem(item);
break;
case "CompoundPathItem":
// CompoundPath内の各パスを処理
for (var p = 0; p < item.pathItems.length; p++) {
processPathItem(item.pathItems[p]);
}
break;
case "TextFrame":
processTextFrame(item);
break;
case "GroupItem":
// グループ内のアイテムを再帰処理
for (var g = 0; g < item.pageItems.length; g++) {
processItem(item.pageItems[g]);
}
break;
case "PluginItem":
// ブレンド・エンベロープ・3D効果等
// ExtendScript APIでは内部パスにアクセス不可
skippedPluginItems.push(item);
break;
case "SymbolItem":
// シンボルインスタンス(直接編集すると全インスタンスに影響)
skippedSymbolItems.push(item);
break;
case "PlacedItem":
case "RasterItem":
// 配置画像・ラスター画像は処理対象外
break;
default:
// MeshItem 等、その他のアイテムは処理しない
break;
}
}
// =====================================================================
// メイン処理
// =====================================================================
var processedCount = 0;
for (var i = 0; i < sel.length; i++) {
processItem(sel[i]);
processedCount++;
}
// 画面を再描画(色変更を反映)
app.redraw();
// ----- スキップされたオブジェクトがあれば選択状態にする -----
var skippedAll = skippedPluginItems.concat(skippedSymbolItems);
if (skippedAll.length > 0) {
// 現在の選択を解除
doc.selection = null;
// スキップされたオブジェクトだけを選択状態にする
for (var s = 0; s < skippedAll.length; s++) {
skippedAll[s].selected = true;
}
app.redraw();
}
// ----- 結果メッセージの組み立て -----
var msg = "処理完了:CMYKカラーを5%刻みに調整しました。";
// スキップ警告があれば追加
var warnings = [];
if (skippedPluginItems.length > 0) {
warnings.push(
"▶ ブレンド・エンベロープ等が "
+ skippedPluginItems.length + " 個検出されました。\n"
+ " → 現在これらが選択された状態です。\n"
+ " → 「オブジェクト > ブレンド > 拡張」で展開後、\n"
+ " 再度スクリプトを実行してください。\n"
+ " ※「分割・拡張」はグラデーションも分解するため使わないでください。"
);
}
if (skippedSymbolItems.length > 0) {
warnings.push(
"▶ シンボルインスタンスが " + skippedSymbolItems.length + " 個検出されました。\n"
+ " → 現在これらが選択された状態です。\n"
+ " → 「シンボルへのリンクを解除」後、再度実行してください。"
);
}
if (warnings.length > 0) {
msg += "\n\n── 未処理のオブジェクト(現在選択中)──\n\n" + warnings.join("\n\n");
}
alert(msg);
})();
スクリプトの保存場所
よく使うスクリプトであれば、Illustratorのスクリプトフォルダに入れておくと「ファイル > スクリプト」メニューから直接実行できて便利です。
Mac
/Applications/Adobe Illustrator(使用中のバージョン名)/Presets/ja_JP/スクリプト/
Windows
C:\Program Files\Adobe Illustrator(使用中のバージョン名)\Presets\ja_JP\スクリプト\
スクリプトフォルダに配置した場合、Illustratorの再起動後にメニューへ反映されます。
任意の場所に置いた場合は「ファイル > スクリプト > その他のスクリプト」から都度指定して実行してください。
スクリプトの実行方法
① ドキュメントをCMYKモードに変換する
スクリプト実行前に、対象ドキュメントのカラーモードをCMYKに変換しておきます。
- RGBのイラストファイルをIllustratorで開く
- 「ファイル > ドキュメントのカラーモード > CMYKカラー」を選択
この時点でカラー値はRGBからCMYKに再計算され、小数点付きの値になります。
ここからがスクリプトの出番です。
yamaドキュメントがRGBモードのままスクリプトを実行すると、「ドキュメントがCMYKモードではありません」というアラートが表示され、処理は実行されません。
② オブジェクトを選択してスクリプトを実行
- 処理したいオブジェクトを選択する(全選択でもOK)
- 「ファイル > スクリプト」からスクリプトを実行
- 完了アラートが表示される
操作はこれだけです。
スクリプトはドキュメント全体ではなく、選択中のオブジェクトだけを処理します。
一部のオブジェクトだけを処理したい場合は、対象を選んでから実行してください。
グループ化されたオブジェクトやクリッピングマスク内のオブジェクトも、再帰的に内部を走査して処理します。グループを解除する必要はありません。
スポンサーリンク
ベタ塗り・線・グラデーションにも対応
単色の塗り・線だけでなく、グラデーションの各ストップも処理対象
ストック素材でよく使われるグラデーション。
CMYK変換後は、グラデーションの各ストップ値にも小数点が入ります。
手動で修正する場合、グラデーションパネルを開き、ストップを1つずつクリックして値を修正する必要があります。ストップが4〜5個あるオブジェクトが複数あれば、それだけで相当な作業量です。
このスクリプトは、オブジェクトの fillColor や strokeColor がグラデーションの場合、内部のストップを自動で走査し、各ストップのCMYK値をすべて5%刻みに丸めます。
処理前後のカラー値を比較する
たとえば、金色のメダルイラストに使われていたグラデーションの場合、以下のように処理されます。
グラデーションストップの処理例
| ストップ | 処理前 | 処理後 |
|---|
| ストップ1 | C:3.85 M:10.4 Y:50.8 K:0 | C:0 M:10 Y:50 K:0 |
| ストップ2 | C:6.27 M:29.02 Y:72.94 K:0.39 | C:5 M:25 Y:70 K:0 |
| ストップ3 | C:11.37 M:36.08 Y:81.96 K:1.57 | C:10 M:35 Y:80 K:0 |
数値がすっきり揃い、カラー管理がしやすくなります。
色味は多少変化するため、処理後の見た目確認は必ず行ってください。
CMYKカラー変換スクリプトが効かない時の対処法
すべてのオブジェクトに万能に効くわけではありません。
illustratorのスクリプト(ExtendScript)には、アクセスできないオブジェクト構造がいくつか存在します。
ブレンドオブジェクト ──「ブレンド > 拡張」で展開してから再実行
ブレンドツールで作成されたオブジェクトは、スクリプトの内部では「PluginItem」という特殊な型として扱われます。
PluginItemの内部にあるパスには、スクリプトからアクセスする手段がありません。
対処法
- スクリプトを実行すると、未処理のブレンドオブジェクトが選択された状態で残る(後述)
- そのまま「オブジェクト > ブレンド > 拡張」を実行
- ブレンドが通常のパスに変換される
- 再度全選択してスクリプトを実行
ここで注意点が1つ。「オブジェクト > 分割・拡張(Expand)」は使わないでください。分割・拡張はブレンドだけでなく、グラデーションも短冊状のパスに分解してしまいます。滑らかなグラデーションが台無しになるため、必ず「ブレンド > 拡張」を使ってください。
テキストのアピアランス設定 ── アウトライン化してから実行
illustratorでテキストに色を設定する方法は複数あります。
スクリプトが処理できるのは、テキストツールで文字を選択して直接設定した文字色のみです。
実務で一般的な「選択ツールでテキストフレームを選び、アピアランスパネルで塗り・線を追加する」方法で設定した色は、ExtendScript APIからアクセスできません。
フレームレベルの追加アピアランスという内部構造に格納されるため、スクリプトの処理対象外となります。
対処法
テキスト部分をアウトライン化(書式 > アウトラインを作成)してからスクリプトを実行してください。アウトライン化すれば通常のパスになるため、スクリプトで処理できます。
入稿前のアウトライン化工程でスクリプト実行が動作上はスムーズなのですが、トーンが変わる可能性が高いので、テキストに関しては使用しない(最初からCMYKで作成する)ことをお勧めします。
シンボル ── リンク解除後に実行
シンボルインスタンスも、内部のカラーにスクリプトからアクセスできません。
シンボルを編集すると、同じシンボルを使っている全インスタンスに影響するという構造上の理由から、スクリプトでは処理をスキップしています。
対処法
シンボルパネルから「シンボルへのリンクを解除」を実行し、通常のグループに変換してからスクリプトを実行してください。
「分割・拡張」は使わない ── グラデーションが壊れる理由
ブレンドやアピアランスの処理で「とりあえず分割・拡張すればいいのでは」と考えるかもしれません。
しかし「オブジェクト > 分割・拡張」は、グラデーションを短冊状の細いパスに分解してしまいます。
分解後のグラデーションは元に戻せません。
滑らかだった色の遷移がパスの境界でカクつき、データ容量も大幅に増加します。
ブレンドの展開には「ブレンド > 拡張」、アピアランスの展開には「アピアランスを分割」と、目的に応じたコマンドを使い分けてください。
スポンサーリンク
複雑なオブジェクトのRGB→CMYK変換時の小数点カラー値のワークフロー
ブレンド等の未処理オブジェクトは自動で選択状態になる
スクリプトは、処理できなかったオブジェクト(ブレンド・シンボル等)を検出すると、完了時に以下の動作を行います。
- 処理可能なオブジェクトはすべてカラーを5%刻みに変換
- 処理できなかったオブジェクトの数と種類をアラートで通知
- 未処理のオブジェクトだけを選択状態に切り替え
アラートを閉じた時点で、画面上にハイライトされているのが「次に対処すべきオブジェクト」です。
どこにあるか探す必要がありません。
推奨ワークフロー ── 実行→通知確認→展開→再実行
ストック素材にブレンドが含まれている場合の推奨手順をまとめます。
準備
RGBファイルを開き、ドキュメントをCMYKモードに変換。
テキストがあればアウトライン化。
1回目のスクリプト実行
全オブジェクトを選択してスクリプトを実行。
単色・グラデーションのカラーが5%刻みに処理される。
通知を確認
ブレンド等が含まれていた場合、アラートで通知。
未処理オブジェクトが選択状態になる。
ブレンドを展開
選択状態のまま「オブジェクト > ブレンド > 拡張」を実行。
2回目のスクリプト実行
再度全選択してスクリプトを実行。
展開されたブレンド内のカラーが処理される。
ブレンドが含まれていなければ、ステップ2で完了します。
スクリプト使用時の注意点
フラットデザイン・アイコン系は影響がほぼ出ない
Adobe Stockで人気のフラットイラストやアイコン素材は、もともと使われている色数が限られています。5%刻みに丸めても見た目の変化はほとんど感じられません。
yamaベタ塗り中心の素材であれば、丸め処理の影響をまず気にする必要はないでしょう。
ブラックの扱いには注意
注意したいのは、ブラックの扱いです。
RGB→CMYKに変換する際、ブラックはCMYKの掛け合わせで出力されます。
純粋なブラック(Kのみ)で表現したい場合、変換後にブラックのオブジェクトを選択し任意のKの濃度に調整してください。
写実的なグラデーションは確認が必要
写実的なイラストや、微妙な色の遷移を多用したグラデーションでは、5%刻みへの丸めで色の階調が粗くなる場合があります。
特に肌色や空のグラデーションなど、繊細なトーンの変化がある部分は、処理後に目視で確認してください。
気になる箇所があれば、そのオブジェクトだけ手動で微調整するのが現実的な対応です。
元ファイルは必ず残しておく
スクリプト実行後、元の小数点数値へ復元できません。
スクリプトを実行する前に、必ず別名でファイルを保存しておいてください。
元データを残しておけば、いつでもやり直せます。
スポンサーリンク
今回のまとめ
illustratorでRGBの素材をCMYKに変換後のカラー数値を5%刻みに調整するスクリプトを紹介しました。
- ベタ塗り、線、グラデーションのオブジェクトを一括変換可能
- ブランドなどを使用している場合は、2回目のスクリプト実行
- テキストには非対応(アウトライン化したものは対応)
- 変換後、色味のチェックはユーザー側で行う
上記がスクリプト使用時のポイントです。
私もAdobeストックを使用しているので、このスクリプトで作業がかなり楽になりました。
ぜひ、参考にしてくださいね。
それでは、今回はこのへんで。