Scripting Photoshop脚本:导出单独文件中的图层组合

Scripting Photoshop脚本:导出单独文件中的图层组合,scripting,flash-cs5,photoshop,layer,photoshop-script,Scripting,Flash Cs5,Photoshop,Layer,Photoshop Script,在PhotoshopCS5中,我有两组层:“模型”和“材质” 第一个(“模型”)将包含简单的层(“汤姆模型”、“吉姆模型”、“哈利模型”…),而另一个(“材料”)将包含另一组:“金属”、“木材”等。 当然,这些材料组本身也有其他层(“金属”将包含:“铁”、“钢”、“铜”等,“木材”将包含“橡木”、“樱桃”、“枫木”等) 我想做的是导出一个jpg文件(quality 72),该文件由每个模型与所有材质组合而成。 两个图层合并在一个文件中 文件名必须与要导出的最后一个子材质层相同,并且应将目标文件夹

在PhotoshopCS5中,我有两组层:“模型”和“材质”

第一个(“模型”)将包含简单的层(“汤姆模型”、“吉姆模型”、“哈利模型”…),而另一个(“材料”)将包含另一组:“金属”、“木材”等。 当然,这些材料组本身也有其他层(“金属”将包含:“铁”、“钢”、“铜”等,“木材”将包含“橡木”、“樱桃”、“枫木”等)

我想做的是导出一个jpg文件(quality 72),该文件由每个模型与所有材质组合而成。 两个图层合并在一个文件中

文件名必须与要导出的最后一个子材质层相同,并且应将目标文件夹(此时可能已创建)称为模型

按照上面的示例,您将得到如下结果:

MODEL TOM
-Iron.jpg
-Steel.jpg
-Copper.jpg
-Oak.jpg
-Cherry.jpg
-Maple.jpg

MODEL JIM
-Iron.jpg
-Steel.jpg
-Copper.jpg
-Oak.jpg
-Cherry.jpg
-Maple.jpg

MODEL HARRY
-Iron.jpg
-Steel.jpg
-Copper.jpg
-Oak.jpg
-Cherry.jpg
-Maple.jpg
我懂一点php和javascript。 做那样的东西很复杂吧? 你有什么建议吗?
谢谢

欢迎使用Photoshop脚本。在层上循环是很容易的,但是组会变得复杂(可能会有点头疼),并且没有简单的方法来索引事物

这个脚本会按照你想要的做(基于一个脚本,它对更复杂的设置做了类似的事情),它会在所有层上循环,并填充两个数组,一个是阿凡达组中的所有内容,另一个是背景组中的所有内容

将Tom、Jim和Harry三层放在一个名为“阿凡达”的组中,其他所有层放在一个名为“背景”的组中。运行时,脚本将把文件保存到名为“output”的文件夹中

//pref像素
app.preferences.rulerUnits=单位.PIXELS;
//调用源文档
var srcDoc=app.activeDocument;
//蔬菜
var numOfLayers=srcDoc.layers.length;
var layers=srcDoc.layers;
//分层蔬菜
var charArr=新数组();//汤姆、吉姆和哈利阿凡达
var bkgArr=新数组();//背景图像
var allLayers=新数组();
var theLayers=collectallayers(app.activeDocument,0);
//浏览角色图像层
GetLayerNameGroupsFromarray(charArr);
//浏览背景图像层
getLayerNamesInGroupsFromArray(bkgArr);
//背景人物
loopOverGroup(“背景”,BKGAR,“化身”,charArr);
函数loopOverGroup(groupname1、arr1、groupname2、arr2)
{
对于(变量i=0;i=0;m--)
{
var theLayer=父层[m];
var parentName=“背景”;
如果(theParent.typename==“LayerSet”)
{
如果(级别==1)parentName=theParent.name;
}
//将该函数应用于LayerSet;
if(theLayer.typename==“ArtLayer”)
{
//打开背景层
var layerName=theLayer.name;
if(parentName!=“Background”)
{
theLayer.visible=true;
}
//寻找背景
if(parentName==“backgrounds”)
{
bkgArr.push(parentName+“:”+theLayer.name);
theLayer.visible=false;
}
//寻找化身
if(parentName==“化身”)
{
charArr.push(parentName+“:”+theLayer.name);
theLayer.visible=false;
}
}
其他的
{
所有层.推送(层+层.名称);
收集所有图层(图层,级别+1)
}
}
}
函数复制(str)
{
//将图像复制到新文档中
如果(arguments.length==0)str=“temp”;
变量id428=charIDToTypeID(“Dplc”);
var desc92=新的ActionDescriptor();
var id429=charIDToTypeID(“空”);
var ref27=新的ActionReference();
var id430=charIDToTypeID(“Dcmn”);
变量id431=charIDToTypeID(“Ordn”);
变量id432=charIDToTypeID(“Frst”);
参考27.经点算的数据(id430、id431、id432);
描述92.参考文献(id429,参考文献27);
var id433=charIDToTypeID(“Nm”);
desc92.putString(id433,str);//名称
执行操作(id428、desc92、DialogModes.NO);
}
函数GetLayerNameGroupsFromArray(arr)
{
//浏览背景图像层
对于(变量i=0;i//pref pixels
app.preferences.rulerUnits = Units.PIXELS;

// call the source document
var srcDoc = app.activeDocument;

// vegetables
var numOfLayers = srcDoc.layers.length;
var layers = srcDoc.layers;

// group layer vegetables
var charArr  = new Array();  // Tom, Jim & Harry avatars
var bkgArr  = new Array(); // background images

var allLayers = new Array();
var theLayers = collectAllLayers(app.activeDocument, 0);

// go over the character image layers
getLayerNamesInGroupsFromArray(charArr);

// go over the background image layers
getLayerNamesInGroupsFromArray(bkgArr);

// Characters on backgrounds
loopOverGroup("backgrounds", bkgArr, "avatars", charArr);

function loopOverGroup(groupname1, arr1, groupname2, arr2)
{

  for (var i = 0; i < arr1.length; i++)
  {
    var subLayer1 = arr1[i];

    app.activeDocument.activeLayer = app.activeDocument.layerSets.getByName(groupname1).artLayers.getByName(subLayer1);
    app.activeDocument.activeLayer.visible = true;

    for (var j = 0; j < arr2.length; j++)
    {
      var subLayer2 = arr2[j];
      // alert(subLayer2);

      app.activeDocument.activeLayer = app.activeDocument.layerSets.getByName(groupname2).artLayers.getByName(subLayer2);
      app.activeDocument.activeLayer.visible = true;

      // Name the file
      var tempName = subLayer1 + "_" + subLayer2;

      duplicateIt(tempName);
      activeDocument.flatten();

      //create folder for it
      makeDirectory("output", srcDoc.path);

      // Set filePath and fileName to source path
      var filePath = srcDoc.path + "/output/" + tempName + ".jpg";

       myJpgQuality = 12;

      // jpg file options
      var jpgFile = new File(filePath);
      jpgSaveOptions = new JPEGSaveOptions();
      jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
      jpgSaveOptions.embedColorProfile = true;
      jpgSaveOptions.matte = MatteType.NONE;
      jpgSaveOptions.quality = myJpgQuality;

      activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);

      // close it
      app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);
      app.activeDocument = srcDoc;

      app.activeDocument.activeLayer.visible = false;
    } // end loop j
  }// end loop i

}



// function collect all layers
function collectAllLayers (theParent, level)
{
  for (var m = theParent.layers.length - 1; m >= 0; m--)
  {
    var theLayer = theParent.layers[m];
    var parentName = "Background";

    if (theParent.typename == "LayerSet")
    {
      if (level == 1) parentName = theParent.name;
    }

    // apply the function to layersets;
    if (theLayer.typename == "ArtLayer")
    {

      // switch the background background layer on
      var layerName = theLayer.name;
      if (parentName != "Background")
      {
        theLayer.visible = true;
      }

      // looking for backgrounds
      if (parentName == "backgrounds")
      {
        bkgArr.push (parentName + ":" + theLayer.name);
        theLayer.visible = false;
      }

      // looking for avatars
      if (parentName == "avatars")
      {
        charArr.push (parentName + ":" + theLayer.name);
        theLayer.visible = false;
      }
    }
    else
    {
      allLayers.push(level + theLayer.name);
      collectAllLayers(theLayer, level + 1)
    }
  }
}


function duplicateIt(str)
{
  // duplicate image into new document
  if (arguments.length == 0) str = "temp";

  var id428 = charIDToTypeID( "Dplc" );
  var desc92 = new ActionDescriptor();
  var id429 = charIDToTypeID( "null" );
  var ref27 = new ActionReference();
  var id430 = charIDToTypeID( "Dcmn" );
  var id431 = charIDToTypeID( "Ordn" );
  var id432 = charIDToTypeID( "Frst" );
  ref27.putEnumerated( id430, id431, id432 );
  desc92.putReference( id429, ref27 );
  var id433 = charIDToTypeID( "Nm  " );
  desc92.putString( id433, str ); // name
  executeAction( id428, desc92, DialogModes.NO );
}



function getLayerNamesInGroupsFromArray(arr)
{
  // go over the background image layers
  for (var i = 0; i < arr.length; i++)
  {
    var temp = arr[i].toString();

    var groupName = temp.substring(0, temp.indexOf(":"));
    var layerName = temp.substring(temp.indexOf(":")+1, temp.length);
    arr[i] = layerName;
  }
  return arr;
}

function makeDirectory(foldername, apath)
{
  // create directory
  var myDirectoryName = apath + "/" + foldername;
  var myDirectory = new Folder(myDirectoryName);
  if(!myDirectory.exists) myDirectory.create();
}