Как я могу получить цвет в слое заливки Photoshop

Я пытаюсь написать сценарий для автоматизации процесса извлечения цветов из нескольких слоев заливки из файла Photoshop, который мы настраиваем в зависимости от использования. Проблема в том, что не существует способа прочитать цвет, назначенный слою-заливке.

Я пробовал все, что мог придумать, но ничего не сработало. Это самое близкое, что я получил до сих пор:

На этом форуме я нашел способ читать значения и имена образцов . Я использовал плагин Scripting Listener для записи действий, но все, что я получаю, это что-то вроде этого, если дважды щелкнуть миниатюру слоя заливки и нажать «Добавить в образцы»:

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 );

То есть я получаю конкретные значения, которые я выбираю в то время, но не могу реализовать это в цикле (по крайней мере, я могу придумать).

Кроме того, если я смогу найти способ сделать каждый цвет слоя заливки по очереди цветом переднего плана, тогда я знаю, что могу это прочитать, но как мне этого добиться? Пипетка кажется вариантом, но я не могу придумать, как заставить ее работать.

Любые идеи?


person Juan Mejías Gómez    schedule 09.10.2013    source источник


Ответы (1)


Он был там все время, я думаю. В ветке форума, упомянутой выше, говорится :

это в основном то, как работают корректирующие слои. Существует список Adjs, который обычно содержит один объект Adjustment, в данном случае 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);

Я надеюсь, что это будет полезно для кого-то, хотя, как я уже сказал, жаль, что я не заметил раньше!

person Juan Mejías Gómez    schedule 10.10.2013