将智能对象的比例重置为100%的脚本

时间:2018-02-08 16:32:17

标签: javascript resize photoshop jsx photoshop-script

我试图制作一个脚本,它会在图层上占用一个元素并将其大小恢复到100%。

这是我到目前为止所做的,但由于某种原因它似乎并没有在智能对象上工作。我错过了什么吗?



try {
  var doc = app.activeDocument;

  var layers = doc.artLayers;

  var size = dialog();
  
  for (var i = 0; i < doc.artLayers.length -1; i++) {

    var activeLayer = doc.artLayers.getByName(doc.artLayers[i].name);

    var orUnits = app.preferences.rulerUnits;

    app.preferences.rulerUnits = Units.PERCENT;

    activeLayer.resize(size, size, AnchorPosition.MIDDLECENTER);

    app.preferences.rulerUnits = orUnits;

  }


} catch (e) {
   alert( e );
}


function dialog() {

  // Dialog box
  var myWindow = new Window("dialog", "Resize Each Layer");

  // Keeps things inline
  myWindow.orientation = "row";

  // Informational text
  myWindow.add("statictext", undefined, "New size ( percentage ):");

  // This is the box where the size is inserted
  var myText = myWindow.add("edittext", undefined, "");
  myText.characters = 5;
  myText.active = true;

  // Ok
  myWindow.add("button", undefined, "OK");
  if (myWindow.show() == 1) return myText.text;

} 
&#13;
&#13;
&#13;

每当我尝试运行它时它都无法工作,它根本不会对智能对象​​起任何作用。

enter image description here

3 个答案:

答案 0 :(得分:1)

对我而言,重置智能对象比例的唯一已知方法是用原始的临时psb文件(参考文件)替换当前的智能层。为此,您首先需要找到智能对象fileReference(临时psb文件的名称,它将在临时文件夹中,您将在层操作描述符中找到它),然后将其放置在文档中(使用文件>放置嵌入式),将其置于原始图层的坐标处,然后删除原始图层。这是一种算法:

var originalLayer = activeDocument.activeLayer,
    bounds = activeDocument.activeLayer.bounds,
    smartObjectName = getFileReference() //get file reference here

placeLayer(Folder.temp + "/" + smartObjectName) //function to place layer with path to layer as an argument
centerLayerBasedOnBounds(bounds)
originalLayer.remove()

答案 1 :(得分:1)

通过调整这里找到的代码,我可以使用ActionReference获得活动层的未缩放尺寸; https://community.adobe.com/t5/photoshop/how-can-i-capture-a-smart-object-s-original-dimension-via-scripts/td-p/9679328?page=1

// works on active layer
function getUnscaledLayerDimensions() {
  var ref = new ActionReference();

  ref.putEnumerated(
    charIDToTypeID("Lyr "),
    charIDToTypeID("Ordn"),
    charIDToTypeID("Trgt")
  );

  var obj = executeActionGet(ref).getObjectValue(
    stringIDToTypeID("smartObjectMore")
  );

  var _tmp = obj.getObjectValue(stringIDToTypeID("size"));

  return {
    width: _tmp.getDouble(stringIDToTypeID("width")),
    height: _tmp.getDouble(stringIDToTypeID("height")),
  };
}

然后您可以将这些尺寸与图层边界一起使用,以将size()调整为最大100%

答案 2 :(得分:0)

layer.resize()是相对调整大小,而不是绝对调整大小,因此,如果您告诉它将调整大小调整为100%,那将无济于事-您正在告诉它将调整大小调整为当前大小。您需要知道当前的比例才能做到这一点(我认为这是不公开的)。

我认为无法通过脚本或录制的动作来重置智能对象的比例。 Photoshop的API对智能对象​​的支持不是很好...