デザイン自動化メモ(InDesignのテキストフレームの背景色をグレースケールにする)


DTPのカンプチェック時に一部のオブジェクト以外をグレースケールにする。
検版とか機械学習するデータを作るときに使えないかと試作。
InDesignはオブジェクトごとに、やり方が異なります。
とりあえず、テキストフレームの背景色から。

特定の条件を満たすテキストフレームの背景色を変更する

ここでは、グレースケールに変換する対象を、スクリプトラベルが空白、カラー指定がスウォッチの場合に限っています。
グレースケールへの変換は、RGB経由で輝度を出しています。
2018/6/24 輝度からKへの計算でK=100-輝度のところK=輝度と間違えていました。訂正しました。

function main() {

    pageObj = app.activeDocument.pages[0];
    total = pageObj.allPageItems.length;

    for (i=0;i<total;i++) {
       var label = "";
       var typeName = "";
       var pageItem;

       pageItem = pageObj.allPageItems[i];

       var typeName = pageItem.constructor.name;
       label = pageItem.label;

       // テキストフレームのときの背景色を変更する。
       if (typeName=="TextFrame") {

           // 特定のテキストフレームは処理をしない。ここではスクリプトラベルで判断する。
           if (label=="hoge") {

               continue;
           }

            // 設定されている背景色を取得する。
            var col = pageItem.fillColor;
            var cs = col.space;

            // カラーモデルがCMYKなのを確認し、CMYK以外なら処理しない。
            // 実際に使う場合はエラーにします。
            if (cs!=ColorSpace.CMYK) {

                continue;
            }

            var c = col.colorValue[0];
            var m = col.colorValue[1];
            var y = col.colorValue[2];
            var k = col.colorValue[3];

            // InDesignのCMYKは0% - 100%になるので、0-255にスケール変換
            var c255 = c*2.55;
            var m255 = m*2.55;
            var y255 = y*2.55;
            var k255 = k*2.55;

            // なんちゃってRGB
            var r = Math.max(0,255- c255 - k255);
            var g = Math.max(0,255- m255 - k255);
            var b = Math.max(0,255- y255 - k255);

            // 輝度を出す
            var luminance = Math.round(0.2990 * r  + 0.5870 * g + 0.1140 * b);

            // スケールを 0% - 100%に戻す
            var retk = 100 - Math.round(luminance / 2.55);

            alert(retk);

            // スォッチを追加
            var sname = "K" + retk;

               for (i=0;i<app.activeDocument.colors.length;i++) {
                    if (app.activeDocument.colors[i].name==sname) {
                        app.activeDocument.colors[i].remove();
                    }
               }

            colorOption = {colorValue:[0,0,0,retk],model:ColorModel.process,space:ColorSpace.cmyk,name:sname}
            colorObj = app.activeDocument.colors.add(colorOption);            

            // 背景色を反映
            pageItem.fillColor = colorObj;
       }
    }
 }

main();

シアン100%から変換した結果

マゼンダ100%から変換した結果