试图提取Photoshop图层坐标和尺寸。

问题描述 投票:0回答:1

Photoshop文件示例。

[Layer 1]
[Group 1]
   [Layer 2]
   [Layer 3]
[Layer 4 (Hidden)]
[Layer 5]

期望的输出 (冒号文件):

Layer 1:x:y:w:h
Group 1:Layer 2:x:y:w:h
Group 1:Layer 3:x:y:w:h
Layer 5:x:y:w:h

如你所见,我试图将每个图层的名称及其坐标和尺寸写到一个用冒号分隔的文本文件中。忽略任何隐藏的图层,并将组名附加到组内的任何图层上。我可以用这个脚本得到每个图层的坐标和尺寸。

// Enables double-click launching from the Mac Finder or Windows Explorer
#target photoshop

// Bring application forward
app.bringToFront();

// Set active Document variable and decode name for output
var docRef = app.activeDocument;
var docName = decodeURI(activeDocument.name);

// Define pixels as unit of measurement
var defaultRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;

// Define variable for the number of layers in the active document
var layerNum = app.activeDocument.artLayers.length;

// Define variable for the active layer in the active document
var layerRef = app.activeDocument.activeLayer;

// Define varibles for x and y of layers
var x = layerRef.bounds[0].value;
var y = layerRef.bounds[1].value;
var w = layerRef.bounds[2].value;
var h = layerRef.bounds[3].value;
var coords = "";

// Loop to iterate through all layers
function recurseLayers(currLayers) {
  for ( var i = 0; i < currLayers.layers.length; i++ ) {
    layerRef = currLayers.layers[i];
    if (!layerRef.visibility) {
        continue;
    }       
    x = layerRef.bounds[0].value;
    y = layerRef.bounds[1].value;
    w = layerRef.bounds[2].value - x;
    h = layerRef.bounds[3].value - y;
    coords += layerRef.name + ":" + x + ":" + y + ":" + w + ":" + h + "\n";

    //test if it's a layer set
    if ( isLayerSet(currLayers.layers[i]) ) {
      recurseLayers(currLayers.layers[i]);
    }
  }
}

//a test for a layer set
function isLayerSet(layer) {
  try {
    if ( layer.layers.length > 0 ) {
      return true;
    }
  }

  catch(err) {
    return false;
  }
}

// Ask the user for the folder to export to
var FPath = Folder.selectDialog("Save exported coordinates to");

// Detect line feed type
if ( $.os.search(/windows/i) !== -1 ) {
  fileLineFeed = "Windows";
}
else {
  fileLineFeed = "Macintosh";
}

// Export to txt file
function writeFile(info) {
  try {
    var f = new File(FPath + "/" + docName + ".txt");
    f.remove();
    f.open('a');
    f.lineFeed = fileLineFeed;
    f.write(info);
    f.close();
  }
  catch(e){}
}

// Run the functions
recurseLayers(docRef);
preferences.rulerUnits = defaultRulerUnits; // Set preferences back to user 's defaults
writeFile(coords);

// Show results
if ( FPath == null ) {
  alert("Export aborted", "Canceled");
}
else {
  alert("Exported " + layerNum + " layer's coordinates to " + FPath + "/" + docName + ".txt " + "using " + fileLineFeed + " line feeds.", "Success!");
}

上面的脚本最初是由Chris DeLuca在这个网站上提供的,我做了一些小的修改来提供尺寸。然而,它列出了所有的图层,无论它们是否被隐藏,并且不关心组(图层集--对吗?

为了忽略隐藏的图层,我把递归函数改成了这样。

// Loop to iterate through all layers
function recurseLayers(currLayers) {
  for ( var i = 0; i < currLayers.layers.length; i++ ) {
    layerRef = currLayers.layers[i];
    if (!layerRef.visibility) {
        continue;
    }       
    x = layerRef.bounds[0].value;
    y = layerRef.bounds[1].value;
    w = layerRef.bounds[2].value - x;
    h = layerRef.bounds[3].value - y;
    coords += layerRef.name + "," + x + "," + y + "," + w + "," + h + "\n";

    //test if it's a layer set
    if ( isLayerSet(currLayers.layers[i]) ) {
      recurseLayers(currLayers.layers[i]);
    }
  }
}

以为这样就可以忽略任何隐藏的图层。不幸的是,这将产生一个零字节的文件。

所以,暂时忽略这个问题,并尝试分组问题。我不希望一个组被列出,但我确实希望组的名称被附加到组内任何图层的开头。 我试过这个方法。

    // Loop to iterate through all layers
function recurseLayers(currLayers) {
  for ( var i = 0; i < currLayers.layers.length; i++ ) {
    layerRef = currLayers.layers[i];
    x = layerRef.bounds[0].value;
    y = layerRef.bounds[1].value;
    w = layerRef.bounds[2].value - x;
    h = layerRef.bounds[3].value - y;
    coords += group + ":" + layerRef.name + ":" + x + :," + y + ":" + w + ":" + h + "\n";
    group = "";

    //test if it's a layer set
    if ( isLayerSet(currLayers.layers[i]) ) {
        group = currLayers.layers[i]
        recurseLayers(currLayers.layers[i]);
    }
  }
}

但这只能将组名附加到第一层的图层上 真的可以理解,但我不知道如何得到每个层的父组。

任何关于这些问题的帮助都将是非常感激的.谢谢。

javascript photoshop photoshop-script
1个回答
0
投票

我已经修整了几个小时,并设法回答了我自己的问题,这是一个有点黑客,我敢肯定,有一个更优雅的解决方案,但它的工作原理!它是在这里,如果有人需要它,它的工作原理。

如果有人需要的话,就在这里吧。

#target photoshop

// Bring application forward
app.bringToFront();

// Set active Document variable and decode name for output
var docRef = app.activeDocument;
var docName = decodeURI(activeDocument.name);

// Define pixels as unit of measurement
var defaultRulerUnits = preferences.rulerUnits;
preferences.rulerUnits = Units.PIXELS;

// Define variable for the number of layers in the active document
var layerNum = app.activeDocument.artLayers.length;

// Define variable for the active layer in the active document
var layerRef = app.activeDocument.activeLayer;

// Define varibles for x and y of layers
var x = layerRef.bounds[0].value;
var y = layerRef.bounds[1].value;
var w = layerRef.bounds[2].value;
var h = layerRef.bounds[3].value;
var coords = "";
var group = "";
var layersInGroup = 0;
var thisGroupsLayer = 0;
var inGroup = false;

// Loop to iterate through all layers
function recurseLayers(currLayers) {
  for ( var i = 0; i < currLayers.layers.length; i++ ) {
    layerRef = currLayers.layers[i];
    if (!layerRef.visible) {
        continue;
    }

    if (isLayerSet(currLayers.layers[i]) == 0){
        x = layerRef.bounds[0].value;
        y = layerRef.bounds[1].value;
        w = layerRef.bounds[2].value - x;
        h = layerRef.bounds[3].value - y;
        coords += group + layerRef.name + ":" + x + ":" + y + ":" + w + ":" + h + "\n";
    }

    if (inGroup && thisGroupsLayer == layersInGroup){
        inGroup = false;
        group = "";
        thisGroupsLayer = 0;
    }

    if (inGroup && thisGroupsLayer != layersInGroup){
        thisGroupsLayer++;  
    }

    if (!inGroup){
        layersInGroup = isLayerSet(currLayers.layers[i]);
        if ( layersInGroup ) {
            var groupname = currLayers.layers[i].toString();
            group = groupname.substring(0, groupname.length-1);
            group = group.slice(10, group.length)+":";
            inGroup = true;
            thisGroupsLayer++;
            recurseLayers(currLayers.layers[i]);
        }
    }
  }
}

//a test for a layer set
function isLayerSet(layer) {
  try {
    if ( layer.layers.length > 0 ) {
      return layer.layers.length;
    }
  }

  catch(err) {
    return false;
  }
}

// Ask the user for the folder to export to
var FPath = Folder.selectDialog("Save exported coordinates to");

// Detect line feed type
if ( $.os.search(/windows/i) !== -1 ) {
  fileLineFeed = "Windows";
}
else {
  fileLineFeed = "Macintosh";
}

// Export to txt file
var filename = docName.substring(0, docName.length - 4) + " subimages.txt";
function writeFile(info) {
  try {
    var f = new File(FPath + "/" + filename);
    f.remove();
    f.open('a');
    f.lineFeed = fileLineFeed;
    f.write(info);
    f.close();
  }
  catch(e){}
}

// Run the functions
recurseLayers(docRef);
preferences.rulerUnits = defaultRulerUnits; // Set preferences back to user 's defaults
writeFile(coords);

// Show results
if ( FPath == null ) {
  alert("Export aborted", "Canceled");
}
else {
  alert("Exported " + layerNum + " layer's coordinates to " + FPath + "/" + filename + " using " + fileLineFeed + " line feeds.", "Success!");
}
© www.soinside.com 2019 - 2024. All rights reserved.