我正在编写一个简单的Photoshop脚本,在其中我需要活动层可见部分的边界(即应用掩码之后的边界)。
谢天谢地,ArtLayer.bounds属性为您提供了任何给定层的准确信息。
但是,如果活动层实际上是一个组(层集),事情就变得复杂了。
首先,这个群体的面具效应被完全忽略了。第二,层的可见性状态也被忽略了。
因此,我的问题是:,如何获得图层集(组)可见部分的界?
或者,至少,如何获得组掩码的界?,如果有,我可以遍历组的所有可见层边界,并将它们与掩码边界交叉,以得到我需要的内容。
我在参考指南中没有找到任何方法或属性可以给我任何一个方法或属性。
任何帮助都将不胜感激!谢谢!
发布于 2016-01-29 23:16:25
下面是一个hacky解决方案,它创建一个组的临时副本,合并它,得到它的边界,删除它,然后返回到将处理不可见层的组
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
现在,如果您想要处理掩码,脚本会变得更长一些:
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编写
https://stackoverflow.com/questions/35093886
复制相似问题