見出し画像

選択した配置画像をマスクするスクリプト

【追記】最上位のレイヤーがロックされているときにスクリプトが実行されません。また、ロックされていないとき、最上位のレイヤーに移動してしまいます。
→ 調整を試みます!

Illustratorでは配置画像を選択し、⌘ + 7キーで同じ大きさでマスクされます。実行直後はパスが選択されていますので、バウンディングボックスを調整してトリミングできます。

配置画像の複数のときにも同様に処理されますが、複数のときにはパスでなく、クリップグループが選択されるのが理想です。

ChatGPTに頼んで書いてもらいました。

 #target  illustrator

function main() {
    var doc = app.activeDocument;
    var createdRects = [];

    // 選択されたすべてのオブジェクトに対してループ
    for (var i = 0; i < app.selection.length; i++) {
        var selectedItem = app.selection[i];

        // クリッピングマスクの場合、マスクを解除してパスを削除
        if (selectedItem.typename === "GroupItem" && selectedItem.clipped) {
            releaseClippingMask(selectedItem);
        }
    }

    // クリッピングマスクを解除した後の選択範囲に対して再度ループ
    for (var i = 0; i < app.selection.length; i++) {
        var selectedItem = app.selection[i];

        // 画像が選択されている場合、クリッピングマスクを作成
        if (selectedItem.typename === "PlacedItem" || selectedItem.typename === "RasterItem") {
            var rect = createClippingMask(selectedItem);
            createdRects.push(rect);
        }
    }

    // 選択状態の更新
    updateSelection(createdRects);
}

function releaseClippingMask(groupItem) {
    var clippingPath = groupItem.pageItems[0];
    groupItem.clipped = false;
    clippingPath.remove();
    ungroup(groupItem);
}

function createClippingMask(imageItem) {
    var doc = app.activeDocument;
    var rect = doc.pathItems.rectangle(imageItem.top, imageItem.left, imageItem.width, imageItem.height);
    var group = doc.groupItems.add();
    imageItem.moveToBeginning(group);
    rect.moveToBeginning(group);
    group.clipped = true;
    return rect;
}

function ungroup(groupItem) {
    while (groupItem.pageItems.length > 0) {
        groupItem.pageItems[0].moveToBeginning(groupItem.layer);
    }
    groupItem.remove();
}

function updateSelection(rects) {
    var doc = app.activeDocument;
    doc.selection = null;
    for (var i = 0; i < rects.length; i++) {
        rects[i].parent.selected = true;
    }
}

main();

すでにクリッピングマスクが適用されている場合にはクリッピングマスクを解除し、パスを削除、残った配置された画像または埋め込み画像も対象にします。

パスとパスは対象外なので、オリジナルのクリッピングマスクと併用してください。

グラフィックスタイルの適用

クリップグループに対してグラフィックスタイルを与えるとき、クリッピングマスク適用後にオブジェクトを選択し直す必要がありました。

ついつい忘れて「あれ?」となるペインポイントが解消されます。

クリップグループにしておけば、円にしたり、黒い塗りを追加し、描画モードを「色相」に設定してグレースケール化するなど、自由度が増します。

少し前まで次のような手間をかけていましたが、不要になりました。

  • Photoshopでモノクロ化

  • Illustratorで(マスク用の)正円を描画

選択した配置画像の短辺と同じ長さの正方形でマスクする

「正方形でマスクしたい」場合にも対応できるようにしました。

中身はこんな感じ。

 #target  illustrator

function main() {
    var doc = app.activeDocument;
    var selectedItems = app.selection;
    var createdGroups = [];

    for (var i = 0; i < selectedItems.length; i++) {
        var item = selectedItems[i];

        // クリッピングマスクの処理
        if (item.typename === 'GroupItem' && item.clipped) {
            item.clipped = false;

            var itemsToProcess = [];
            for (var j = item.pageItems.length - 1; j >= 0; j--) {
                var pageItem = item.pageItems[j];
                if (pageItem.typename === 'PlacedItem' || pageItem.typename === 'RasterItem') {
                    itemsToProcess.push(pageItem);
                } else {
                    pageItem.remove();
                }
            }

            // 解除したクリッピングマスク内の画像を処理
            for (var k = 0; k < itemsToProcess.length; k++) {
                var imageItem = itemsToProcess[k];
                processImage(imageItem, createdGroups);
            }
        }
        // 配置された画像または埋め込み画像の処理
        else if (item.typename === 'PlacedItem' || item.typename === 'RasterItem') {
            processImage(item, createdGroups);
        }
    }

    // 画像処理関数
    function processImage(image, groups) {
        var bounds = image.visibleBounds; // 画像の境界を取得
        var width = bounds[2] - bounds[0];
        var height = bounds[1] - bounds[3];
        var sideLength = Math.min(width, height);
        var centerX = bounds[0] + width / 2;
        var centerY = bounds[1] - height / 2;

        var square = doc.pathItems.rectangle(centerY + sideLength / 2, centerX - sideLength / 2, sideLength, sideLength);

        var group = doc.groupItems.add();
        image.moveToBeginning(group);
        square.moveToBeginning(group);
        group.clipped = true;

        groups.push(group);
    }

    // 選択をクリア
    doc.selection = null;

    // 選択対象の処理
    if (createdGroups.length === 1) {
        createdGroups[0].pageItems[1].selected = true; // 対応するパスを選択
    } else {
        for (var l = 0; l < createdGroups.length; l++) {
            createdGroups[l].selected = true; // すべてのクリッピンググループを選択
        }
    }
}

main();

ChatGPTチャット

ChatGPTのチャットのログ

https://chat.openai.com/share/f1c0aa35-f87b-42e8-84ba-139006e3da40

ファイル名

スクリプトをファイル化するとき、面倒なのがファイル名です。これもChatGPTに提案してもらうとよいでしょう。

番外編

マスクを解除するとき、中身だけにする/パスだけにするスクリプトは、Gorolib Designさんが公開されています。

むっちゃ重宝します!!

ダウンロード

スクリプトファイル

Keyboard Maestroマクロ


Illustratorファイル

ここから先は

0字 / 1ファイル
月に10-20本くらいの記事を投稿しています。定期購読されると、更新のお知らせを受け取ったり、マガジン限定記事やサンプルファイルをダウンロードできます。 購読を開始した月に更新された記事から読むことができます(初月無料)。

DTP Transit 定期購読マガジン

¥100 / 月 初月無料

マガジン限定記事やサンプルファイルをダウンロードできます。

定期マガジンを購読されるとサンプルファイルをダウンロードいただけます。 https://note.com/dtp_tranist/m/mebd7eab21ea5