syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Photoshopのレイヤー数をスクリプトで数える

本業の仕事が忙しかったこともあり、前回の記事から1年近く何も書けませんでした。すでにはてな記法を忘れつつありますが、ぼちぼち頑張ります。

Photoshop内部では、レイヤーを"art layer"、グループ(フォルダーアイコン)を"layer set"と呼んでいます。
今日はExtendScriptを使って、ドキュメント中のレイヤーとグループの数を自動的にカウントしてみます。

function getArtLayerCount(layerSet) {
    var na = layerSet.artLayers.length;
    for (var i = 0; i < layerSet.layerSets.length; ++i) {
        na += getArtLayerCount(layerSet.layerSets[i]);
    }
    return na;
}

function getLayerCountPair(layerSet) {
    var na = layerSet.artLayers.length;
    var ns = layerSet.layerSets.length;
    for (var i = 0; i < layerSet.layerSets.length; ++i) {
        var pair = getLayerCountPair(layerSet.layerSets[i]);
        na += pair[0];
        ns += pair[1];
    }
    return [na, ns];
}

//alert("Total art-layer count = " + getArtLayerCount(app.activeDocument));

var pair = getLayerCountPair(app.activeDocument);
alert("Total art-layer count = " + pair[0] + "\n"
    + "Total layer-set count = " + pair[1] + "\n"
    + "Total item count = " + (pair[0] + pair[1]));

app.activeDocumentを基点として、関数を再帰的に呼び出すことでトータルのレイヤー数およびグループ数を求めます。今回はレイヤー数とグループ数のペアを管理するのに配列を使ってみました。
ちなみにこのスクリプト、かなり負荷が高いので、100個くらいレイヤーがあるときにExtendScript Toolkit上でデバッグ実行するとめちゃくちゃ時間がかかります。デバッグが済んで不具合がないことが確認できたスクリプトはjsxファイルとして保存し、Photoshop本体の[ファイル]→[スクリプト]→[参照]でファイルを指定して実行しましょう。ただし通常実行でもかなり重いです。頻繁に使う場合、PSDファイルを直接パースしてレイヤー数を取得するコマンドラインツールを書いたほうがいいかもしれません。

Photoshop v7.0以降ではレイヤー数の上限は事実上ないようなのですが、SAI v1.xではレイヤー数上限が256 (255?) 枚までとなっているため、定期的にレイヤー数を確認して、不要なレイヤーを削除したり結合したりしておく必要があります。SAI v2では上限が8190枚となる予定だそうです。ぶっちゃけ64bitネイティブ移植して各種上限を撤廃するだけであればそんなに開発に時間がかかるとは思えないんですが、大幅な機能追加や仕様変更を伴っているせいで正式リリースがいつになることやら……気長に待つしかなさそうです。