首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Photoshop脚本-如何获得图层集合(组)可见部分的边界?

Photoshop脚本-如何获得图层集合(组)可见部分的边界?
EN

Stack Overflow用户
提问于 2016-01-29 20:55:19
回答 1查看 4.6K关注 0票数 2

我正在编写一个简单的Photoshop脚本,在其中我需要活动层可见部分的边界(即应用掩码之后的边界)。

谢天谢地,ArtLayer.bounds属性为您提供了任何给定层的准确信息。

但是,如果活动层实际上是一个组(层集),事情就变得复杂了。

首先,这个群体的面具效应被完全忽略了。第二,层的可见性状态也被忽略了。

因此,我的问题是:,如何获得图层集(组)可见部分的界?

或者,至少,如何获得组掩码的界?,如果有,我可以遍历组的所有可见层边界,并将它们与掩码边界交叉,以得到我需要的内容。

我在参考指南中没有找到任何方法或属性可以给我任何一个方法或属性。

任何帮助都将不胜感激!谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-29 23:16:25

下面是一个hacky解决方案,它创建一个组的临时副本,合并它,得到它的边界,删除它,然后返回到将处理不可见层的组

代码语言:javascript
运行
复制
var mfDoc = activeDocument;
var mflayer = activeDocument.activeLayer; // currently active layer
var mfnewdLayer = mfDoc.activeLayer.duplicate(); // Dublicates active layer or group (creating a temp layer)
mfDoc.activeLayer = mfnewdLayer; // sets the temp layer as the active layer
mfnewdLayer.merge(); // merges it, this leaves only visible layers

var mfmlayer = activeDocument.activeLayer; //Grab the currently selected layer
var mfheight = mfmlayer.bounds[2]-mfmlayer.bounds[0]; //Grab the H value
var mfwidth = mfmlayer.bounds[3]-mfmlayer.bounds[1]; //Grab the W value

mfmlayer.remove(); // delete the temp layer
mfDoc.activeLayer = mflayer; // gets back to the layer that was active at the begining
mflayer.name = mfheight + " x " + mfwidth // set it's name to the dimintions we now have

现在,如果您想要处理掩码,脚本会变得更长一些:

代码语言:javascript
运行
复制
var mfDoc = activeDocument;
var mflayer = activeDocument.activeLayer; // currently active layer
var mfnewdLayer = mfDoc.activeLayer.duplicate(); // Dublicates active layer or group (creating a temp layer)
mfDoc.activeLayer = mfnewdLayer; // sets the temp layer as the active layer
mfnewdLayer.merge(); // merges it, this leaves only visible layers

var mfmlayer = activeDocument.activeLayer; //Grab the currently selected layer

        if (hasVectorMask() == true){ // Only if it has a layer mask
                selectVectorMask(); // Select the vector mask
                rasterizeVectorMask(); // rasterize the vector mask
                applyLayerMask(); // Apply the layer mask
            }
        if (hasLayerMask() == true){ // Only if it has a layer mask
                selectLayerMask(); // Select the layer mask
                applyLayerMask(); // Apply the layer mask
            }
        if (hasFilterMask() == true){ // Only if it has a Smart Filter mask
            }

var mfheight = mfmlayer.bounds[2]-mfmlayer.bounds[0]; //Grab the H value
var mfwidth = mfmlayer.bounds[3]-mfmlayer.bounds[1]; //Grab the W value

mfmlayer.remove(); // delete the temp layer
mfDoc.activeLayer = mflayer; // gets back to the layer that was active at the begining
mflayer.name = mfheight + " x " + mfwidth // set it's name to the dimintions we now have



function hasLayerMask() {
var hasLayerMask = 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 ) ) {
        hasLayerMask = true;
    }
}catch(e) {
    hasLayerMask = false;
}
return hasLayerMask;
}


function hasVectorMask() {
var hasVectorMask = false;
try {
    var ref = new ActionReference();
    var keyVectorMaskEnabled = app.stringIDToTypeID( 'vectorMask' );
    var keyKind = app.charIDToTypeID( 'Knd ' );
    ref.putEnumerated( app.charIDToTypeID( 'Path' ), app.charIDToTypeID( 'Ordn' ), keyVectorMaskEnabled );
    var desc = executeActionGet( ref );
    if ( desc.hasKey( keyKind ) ) {
        var kindValue = desc.getEnumerationValue( keyKind );
        if (kindValue == keyVectorMaskEnabled) {
            hasVectorMask = true;
        }
    }
}catch(e) {
    hasVectorMask = false;
}
return hasVectorMask;
}


function hasFilterMask() {
var hasFilterMask = false;
try {
    var ref = new ActionReference();
    var keyFilterMask = app.stringIDToTypeID("hasFilterMask");
    ref.putProperty( app.charIDToTypeID( 'Prpr' ), keyFilterMask);
    ref.putEnumerated( app.charIDToTypeID( 'Lyr ' ), app.charIDToTypeID( 'Ordn' ), app.charIDToTypeID( 'Trgt' ) );
    var desc = executeActionGet( ref );
    if ( desc.hasKey( keyFilterMask ) && desc.getBoolean( keyFilterMask )) {
        hasFilterMask = true;
    }
}catch(e) {
    hasFilterMask = false;
}
return hasFilterMask;
}

function selectLayerMask() {
try{ 
    var id759 = charIDToTypeID( "slct" );
        var desc153 = new ActionDescriptor();
        var id760 = charIDToTypeID( "null" );
            var ref92 = new ActionReference();
            var id761 = charIDToTypeID( "Chnl" );
            var id762 = charIDToTypeID( "Chnl" );
            var id763 = charIDToTypeID( "Msk " );
            ref92.putEnumerated( id761, id762, id763 );
        desc153.putReference( id760, ref92 );
        var id764 = charIDToTypeID( "MkVs" );
        desc153.putBoolean( id764, false );
    executeAction( id759, desc153, DialogModes.NO );
}catch(e) {
    ; // do nothing
}
}

function selectVectorMask() {
try{ 
    var id55 = charIDToTypeID( "slct" );
    var desc15 = new ActionDescriptor();
    var id56 = charIDToTypeID( "null" );
        var ref13 = new ActionReference();
        var id57 = charIDToTypeID( "Path" );
        var id58 = charIDToTypeID( "Path" );
        var id59 = stringIDToTypeID( "vectorMask" );
        ref13.putEnumerated( id57, id58, id59 );
        var id60 = charIDToTypeID( "Lyr " );
        var id61 = charIDToTypeID( "Ordn" );
        var id62 = charIDToTypeID( "Trgt" );
    ref13.putEnumerated( id60, id61, id62 );
desc15.putReference( id56, ref13 );
executeAction( id55, desc15, DialogModes.NO );
}catch(e) {
    ; // do nothing
}
}

function applyLayerMask() {
try{ 
    var id765 = charIDToTypeID( "Dlt " );
        var desc154 = new ActionDescriptor();
        var id766 = charIDToTypeID( "null" );
            var ref93 = new ActionReference();
            var id767 = charIDToTypeID( "Chnl" );
            var id768 = charIDToTypeID( "Ordn" );
            var id769 = charIDToTypeID( "Trgt" );
            ref93.putEnumerated( id767, id768, id769 );
        desc154.putReference( id766, ref93 );
        var id770 = charIDToTypeID( "Aply" );
        desc154.putBoolean( id770, true );
    executeAction( id765, desc154, DialogModes.NO );
}catch(e) {
    ; // do nothing
}
}

Credits:处理掩码脚本的全部内容来自Flatten Masks.jsx,由LeZuse编写

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35093886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档