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



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]);
}
}
}

但这只是将组名附加到其中的第一层。这是可以理解的,但我不知道如何获得每个层的父组。

我们将非常感谢在其中一个或两个问题上提供的任何帮助。感谢

我已经修修补补了几个小时,并设法回答了我自己的问题。这有点麻烦,我相信有一个更优雅的解决方案,但它有效!

如果其他人需要它,它就在这里:

#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!");
}

最新更新