我正在尝试编写一个脚本,以自动从我们根据用途自定义的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 );
也就是说,我得到了当时选择的特定值,但是没有办法在一个循环中实现它(至少我可以想到)。
另外,如果我能找到一种使每种“填充层”颜色依次变为前景色的方法,那么我知道我可以阅读,但是如何到达那里?滴管似乎是一种选择,但我想不出一种使之起作用的方法。
有任何想法吗?
最佳答案
我猜一直在那儿。在the forum thread mentioned above中,它表示:
这基本上就是调整层的工作方式。有一个“ Adjs”列表
通常有一个调整对象,在这种情况下
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);
我希望这对某人有用,尽管正如我所说,我希望我早已注意到!