2013-10-09 66 views
2

我正在嘗試編寫一個腳本來自動從我們根據用途自定義的Photoshop文件中提取多個填充圖層的顏色的過程。 問題是,似乎沒有辦法通過閱讀填充圖層的指定顏色。我如何檢索Photoshop填充圖層中的顏色

我試過了所有我能想到的,但沒有任何工作。這是迄今爲止最接近的:

this論壇我找到了一種讀取色板值和名稱的方法。我用一個腳本插件監聽記錄的行爲,但我得到的是這樣的事情雙擊填充圖層縮略圖,打「添加到色板」時:

var idMk = charIDToTypeID("Mk "); 
var desc90 = new ActionDescriptor(); 
var idnull = charIDToTypeID("null"); 
    var ref42 = new ActionReference(); 
    var idClrs = charIDToTypeID("Clrs"); 
    ref42.putClass(idClrs); 
desc90.putReference(idnull, ref42); 
var idUsng = charIDToTypeID("Usng"); 
    var desc91 = new ActionDescriptor(); 
    var idNm = charIDToTypeID("Nm "); 
    desc91.putString(idNm, """Swatch 3"""); 
    var idClr = charIDToTypeID("Clr "); 
     var desc92 = new ActionDescriptor(); 
     var idRd = charIDToTypeID("Rd "); 
     desc92.putDouble(idRd, 229.000397); 
     var idGrn = charIDToTypeID("Grn "); 
     desc92.putDouble(idGrn, 137.001801); 
     var idBl = charIDToTypeID("Bl "); 
     desc92.putDouble(idBl, 135.997925); 
    var idRGBC = charIDToTypeID("RGBC"); 
    desc91.putObject(idClr, idRGBC, desc92); 
var idClrs = charIDToTypeID("Clrs"); 
desc90.putObject(idUsng, idClrs, desc91); 
executeAction(idMk, desc90, DialogModes.NO); 

也就是說,我得到的具體數值我在那時選擇,但沒有辦法實現這個循環(至少我能想到)。另外,如果我可以找到一種方法讓每個填充圖層顏色依次變爲前景色,那麼我知道我可以讀取它,但是我怎樣才能到達那裏?吸管似乎是一種選擇,但我不能想辦法讓它工作。

任何想法?

回答

3

我猜,它一直在那裏。在the forum thread mentioned above,它說:

這基本上是如何調整層的工作。有一個「調整」列表 其中通常有一個調整對象,在本例中爲 solidColorLayer。裏面是顏色描述符。

我能夠從那裏將每個填充層,如果它是一個調整圖層,並提取顏色數據:

//@include "C:/Program Files/Adobe/Adobe Photoshop CC/Presets/Scripts/xlib/stdlib.js" 

//Create CSV file to record palette 
var skinColors = File ("c:/Skinpalette.txt"); 
if (skinColors.exists) { 
    skinColors.remove(); 
}  
skinColors = new File ("c:/Skinpalette.txt"); 

//Function to extract color from Layer 
function getAdjustmentLayerColor(doc, layer) { 
    var desc = Stdlib.getLayerDescriptor(doc, layer); 
    var adjs = desc.getList(cTID('Adjs')); 

    var clrDesc = adjs.getObjectValue(0); 
    var color= clrDesc.getObjectValue(cTID('Clr ')); 

    var red = Math.round(color.getDouble(cTID('Rd '))); 
    var green = Math.round(color.getDouble(cTID('Grn '))); 
    var blue = Math.round(color.getDouble(cTID('Bl '))); 

    var createdSolidColor = Stdlib.createRGBColor(red, green, blue); 
    var createdRGBColor = createdSolidColor.rgb; 
    return createdRGBColor.hexValue; 
}; 

//Function to cycle through layers and output to external file 
function getColors(layerNode) {  
    for (var i=0; i<layerNode.length; i++) { 
     getColors(layerNode[i].layerSets); 
     for(var layerIndex=0; layerIndex < layerNode[i].artLayers.length; layerIndex++) { 
      var layer=layerNode[i].artLayers[layerIndex]; 
      app.activeDocument.activeLayer = layer; 

      if (layer.kind == LayerKind.SOLIDFILL) { 
       skinColors.open ("a"); 
       skinColors.write(layer.name + " = " + getAdjustmentLayerColor(app.activeDocument, layer) + ";\n"); 
       skinColors.close(); 
      } 
     } 
    } 
} 

getColors(app.activeDocument.layerSets); 

我希望這是有用的人,雖然,正如我所說的,我希望我早點注意到了!