PhotoshopのJavaScriptでレイヤーマスクを作成

こんにちは!Rhinoです。
寒くてたまりませんね。タイピングするのも億劫になってしまいます。

今日はPhotoshopについてのお話です。
Photoshopはお使いでしょうか?
Substance Painterなどの3Dペイントツールがテクスチャ制作の主流になってきましたので、使う機会が減ったという方が多いかもしれないですね。
ですが、まだまだモバイルゲームの開発では高い頻度で使われていますので、選択範囲からレイヤーマスクを簡単に作成できたら便利ではないかなあと思いスクリプトを作成してみました。

ScriptingListener プラグイン

今回スクリプトを書くにあたって APIで用意されていないものが結構ありましたので、Photoshopで行った操作履歴をJavaScriptで記録してくれるScriptingListenerというプラグインを使用しました。
配布場所とインストール方法はこちらになります。
常にプログインを使用すると動作が重くなりますので、必要な時だけプラグインを使用するにして下さい。

ダウンロード可能なプラグインおよびコンテンツ | Photoshop
プラグイン、サンプルファイル、ショートカットなど、Photoshop のダウンロード可能なコãƒ...

選択範囲からレイヤーマスクを作成するJavaScript

レイヤーマスクの判定やレイヤーマスクを削除、または作成する関数の中身がScriptingListenerからの出力結果を参考にしたものになります。
では、また!

#target photoshop
// Photoshopを最前面にする
app.bringToFront();

var doc = app.activeDocument;
var layer = doc.activeLayer;

if( isSelectionRect( doc ) == true ){
    if( layer.typename == "LayerSet" ||  layer.typename == "ArtLayer" && hasLayerMask() == true ){
        delLayerMask( );
    }

    createLayerMaskFromSelectionRect();
}

// レイヤーマスクを持っているかどうか判定
function hasLayerMask() {
    var state = false;
    try {
        var ref = new ActionReference();
        var keyUserMaskEnabled = app.charIDToTypeID( 'UsrM' );
        ref.putProperty( app.charIDToTypeID( 'Prpr' ), keyUserMaskEnabled );
        ref.putEnumerated( app.charIDToTypeID( 'Lyr ' ), app.charIDToTypeID( 'Ordn' ), app.charIDToTypeID( 'Trgt' ) );
        var desc = executeActionGet( ref );
        if ( desc.hasKey( keyUserMaskEnabled ) ) {
            state = true;
            }
        }catch(e) {
            state = false;
            }
        return state;
}

// レイヤーマスクを削除
function delLayerMask( apply ){
    if (apply == undefined) apply = false;
    try{
        var desc = new ActionDescriptor();
        var ref = new ActionReference();
        ref.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID('Msk ') );
        desc.putReference( charIDToTypeID('null'), ref );
        desc.putBoolean( charIDToTypeID('Aply'), apply );
        executeAction( charIDToTypeID('Dlt '), desc, DialogModes.NO );
        return true;
    }catch(e){
        return false;
    }
}

//選択範囲からレイヤーマスクを作成
function createLayerMaskFromSelectionRect(){
    var desc = new ActionDescriptor();
    var ref = new ActionReference();
        
    desc.putClass( charIDToTypeID( 'Nw  ' ), charIDToTypeID( 'Chnl' ) );   
    ref.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID('Msk ') );    
    desc.putReference( charIDToTypeID( 'At  ' ), ref );
    desc.putEnumerated(  charIDToTypeID( 'Usng' ), charIDToTypeID( 'UsrM' ), charIDToTypeID( 'RvlS' ) );
    executeAction( charIDToTypeID( 'Mk  ' ), desc, DialogModes.NO );
 }

//選択範囲があるかどうか判定z
function isSelectionRect( doc ) {
    var state = true;
    try {
        doc.selection.bounds;
    } catch (e) {
        state = false;
    }
    return state;
}

コメント

タイトルとURLをコピーしました