Скрипты Photoshop: экспорт комбинаций слоев в отдельные файлы

В Photoshop CS5 у меня есть две группы слоев: «МОДЕЛЬ» и «МАТЕРИАЛ».

В то время как первый («МОДЕЛЬ») будет содержать простые слои («Модель Том», «Модель Джим», «Модель Гарри» ...), другой («МАТЕРИАЛ») вместо этого будет содержать другую группу: «МЕТАЛЛ» , «ДЕРЕВО» и т. Д. Конечно, эти группы материалов сами будут иметь другие слои («МЕТАЛЛ» будет содержать: «Железо», «сталь», «Медь» и т. Д., «ДЕРЕВО» будет содержать «Дуб», «Вишня», «Клен» и тд).

Я хотел бы экспортировать файл jpg (качество 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. Очень сложно что-то подобное сделать? Есть ли у вас какие-нибудь предложения? Благодарность!


person bipo    schedule 03.03.2016    source источник


Ответы (1)


Добро пожаловать в Photoshop. Перемещение по слоям легко, но с группами это усложняется (и может быть немного головной болью), и нет простого способа индексирования вещей.

Этот сценарий будет вам нужен (на основе сценария, который сделал то же самое для более сложной настройки). Он будет перебирать все слои и заполнять два массива: один всем, что есть в группе Avatar, а другой - всем, что находится в группе Avatar. фоновая группа.

Поместите слои Тома, Джима и Гарри в группу под названием «аватары», а все остальное - в группу под названием «Фоны». При запуске сценарий сохранит файлы в папку с именем «output».

//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();
}
person Ghoul Fool    schedule 09.03.2016