2016-03-03 77 views
0

在Photoshop CS5中,我有兩組圖層:「模型」和「材質」。第一個(「MODEL」)將包含簡單圖層(「Model Tom」,「Model Jim」,「Model Harry」...),而另一個(「MATERIAL」)將包含另一個組(而不是另一個組),而不是另一個組(另一個組) :「金屬」,「木材」等 當然這些材料組會自己有其他層(「金屬」將包含:「鐵」,「鋼」,「銅」等等,「木材」將包含「橡木」 ,「櫻桃」,「楓」等)。Photoshop腳本:在單獨文件中導出圖層組合

我想要做的是導出由每個模型與所有材料組合形成的jpg文件(質量72)。 兩個圖層合併成一個文件。

文件名必須與要導出的最後一個sub-MATERIAL圖層相同,並且目標文件夾(應該可能在此刻創建)應該作爲MODEL調用。

按照上面的例子中,你會碰到這樣的:

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的。 製作類似的東西非常複雜? 你有什麼建議嗎? 謝謝!

回答

0

歡迎的Photoshop腳本。循環遍歷圖層很容易,但對於組來說變得複雜(並且可能會讓人頭疼),並且沒有簡單的索引事物的方法。

這個腳本會做你想要的(基於一個腳本來做一個更復雜的設置類似的事情)它會遍歷所有的圖層,並填充兩個數組之一,包括阿凡達組中的所有內容,其他與背景組中的所有內容。

認沽湯姆,吉姆&哈利層被稱爲「化身」和所謂的「背景」組中一切小組。運行時,腳本會將文件保存到名爲「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(); 
} 
相關問題