JSX复制层adobe photoshop

时间:2012-12-23 15:01:57

标签: javascript photoshop photoshop-script jsx

我遇到了将图层从一个文档复制到另一个文档的问题。我有这个代码(我的photoshop文档中的.jsx脚本)

var docRef = app.activeDocument;
app.activeDocument.selection.selectAll();

var calcWidth  = app.activeDocument.selection.bounds[2] -app.activeDocument.selection.bounds[0];

var calcHeight = app.activeDocument.selection.bounds[3] - app.activeDocument.selection.bounds[1];
var docResolution = app.activeDocument.resolution;

var document = app.documents.add(calcWidth, calcHeight, docResolution);
app.activeDocument = docRef;

try {
  dupObj.artLayers[i].duplicate(document, ElementPlacement.INSIDE);
}
catch(e) {
  alert(e)
}

但我仍然收到错误

  

错误:您只能复制最前面文档中的图层。

您对如何使其有效有任何想法吗?

3 个答案:

答案 0 :(得分:2)

您收到错误的原因是永远不会定义dupObj。我认为你的意思是使用docRef,这是对第1行中源文档的引用。现在似乎工作正常:

var docRef = app.activeDocument;
app.activeDocument.selection.selectAll();

var calcWidth  = app.activeDocument.selection.bounds[2] -app.activeDocument.selection.bounds[0];

var calcHeight = app.activeDocument.selection.bounds[3] - app.activeDocument.selection.bounds[1];
var docResolution = app.activeDocument.resolution;

var document = app.documents.add(calcWidth, calcHeight, docResolution);
app.activeDocument = docRef;

try {
  docRef.artLayers[i].duplicate(document, ElementPlacement.INSIDE); // ** changed to docRef **
}
catch(e) {
  alert(e)
}

据说那里可能会有一些隐藏的错误,你应该看看。在这一行:

docRef.artLayers[i].duplicate(document, ElementPlacement.INSIDE);
永远不会定义

i,显然默认为0而不会抛出错误。结果是您只会复制artLayers数组中的第一个图层。

此外,由于您使用app.activeDocument.selection.selectAll();选择整个文档,因此无需计算选择的大小。它始终与原始文档的大小相同。您可以使用docRef.widthdocRef.height作为新文档的宽度和高度。此外,当你复制一个图层时,无论选择什么,它都会复制整个图层。

如果您只想制作与要复制的图层尺寸相同的新文档,请尝试使用artLayers[i].bounds代替selection.bounds

答案 1 :(得分:0)

您没有调用活动文档:您需要调用对活动文档和您使用的文档的引用 - 因此错误。

var docRef = app.activeDocument;
docRef.selection.selectAll();

var calcWidth  = docRef.selection.bounds[2] -app.activeDocument.selection.bounds[0];

var calcHeight = docRef.selection.bounds[3] - app.activeDocument.selection.bounds[1];
var docResolution = docRef.resolution;

var document = app.documents.add(calcWidth, calcHeight, docResolution);
app.activeDocument = docRef;

try {
  dupObj.artLayers[i].duplicate(document, ElementPlacement.INSIDE);
}
catch(e) {
  alert(e)
}

之前我没有使用dupObj,因为我使用CS和脚本侦听器代码来复制文档 我没有检查过代码,但是试一试。

答案 2 :(得分:0)

问题在于您试图使用一个名为 document 的变量,该变量在 JS 中保留。

正如 Sergey 指出的那样,document(令人惊讶地)不是 JSX 中的保留字因为 Adob​​e JSX 不是“常规”的 JSX

虽然它没有解决确切的语法错误,但我还是留在这里,因为它是解决在文档之间复制图层的整体问题的快速方法。

// Grab docs
const doc1 = app.activeDocument
const doc2 = app.documents.add(100, 100)

const outputLayer = doc1.layers[0]
const inputLayer = doc2.layers[0]

inputLayer.duplicate(outputLayer, ElementPlacement.INSIDE)