[PS CS4-CS6] Поиск и замена цвета

  • Автор темы Автор темы Deniks
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.
это, то я понял, вопрос возник с этим что делать?

Код:
function getFillColor(){
var ref = new ActionReference();
   ref.putEnumerated( stringIDToTypeID( "contentLayer" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ));
var ref1= executeActionGet( ref );
var list =  ref1.getList( charIDToTypeID( "Adjs" ) ) ;
var solidColorLayer = list.getObjectValue(0);       
var color = solidColorLayer.getObjectValue(charIDToTypeID('Clr '));
var fillcolor = new SolidColor;
   fillcolor.rgb.red = color.getDouble(charIDToTypeID('Rd  '));
   fillcolor.rgb.green = color.getDouble(charIDToTypeID('Grn '));
   fillcolor.rgb.blue = color.getDouble(charIDToTypeID('Bl  '));
return fillcolor;
 
Ну опять же по аналогии
Код:
var fillcolor = new SolidColor;
   fillcolor.rgb.red = color.getDouble(charIDToTypeID('Rd  '));
   fillcolor.rgb.green = color.getDouble(charIDToTypeID('Grn '));
   fillcolor.rgb.blue = color.getDouble(charIDToTypeID('Bl  '));
поменять на соответствующее cmyk составляющие
Кстати вопрос - а что разве без замены не работает?
 
Так не работает:

Код:
// ChangeColor.jsx
//
// This photoshop script finds all shape and solid fill layers that match the color
// of the currently selected shape/fill layer and changes their color to the
// foreground color.
//
// Tested on Adobe Photoshop CS4 (Mac)

// enable double clicking from the Macintosh Finder or the Windows Explorer
#target photoshop

// in case we double clicked the file
app.bringToFront();

var sColor = getFillColor();

for( var i = 0; i < app.activeDocument.layers.length; i++ )
{
    app.activeDocument.activeLayer = app.activeDocument.layers[i];
    if( getFillColor().rgb.hexValue == sColor.rgb.hexValue )
        setColorOfFillLayer( app.foregroundColor );
}

function setColorOfFillLayer( sColor ) {
    var desc = new ActionDescriptor();
        var ref = new ActionReference();
        ref.putEnumerated( stringIDToTypeID('contentLayer'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    desc.putReference( charIDToTypeID('null'), ref );
        var fillDesc = new ActionDescriptor();
            var colorDesc = new ActionDescriptor();
            colorDesc.putDouble( charIDToTypeID('Cyn'), sColor.cmyk.cyan );
            colorDesc.putDouble( charIDToTypeID('Mgnt'), sColor.cmyk.magenta);
            colorDesc.putDouble( charIDToTypeID('Ylw'), sColor.cmyk.yellow );
            colorDesc.putDouble( charIDToTypeID('Blck'), sColor.cmyk.black );
        fillDesc.putObject( charIDToTypeID('Clr '), charIDToTypeID('CMYC'), colorDesc );
    desc.putObject( charIDToTypeID('T   '), stringIDToTypeID('solidColorLayer'), fillDesc );
    executeAction( charIDToTypeID('setd'), desc, DialogModes.NO );
}

function getFillColor(){
var ref = new ActionReference();
   ref.putEnumerated( stringIDToTypeID( "contentLayer" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ));
var ref1= executeActionGet( ref );
var list =  ref1.getList( charIDToTypeID( "Adjs" ) ) ;
var solidColorLayer = list.getObjectValue(0);       
var color = solidColorLayer.getObjectValue(charIDToTypeID('Clr '));
var fillcolor = new SolidColor;
            colorDesc.putDouble( charIDToTypeID('Cyn'), sColor.cmyk.cyan );
            colorDesc.putDouble( charIDToTypeID('Mgnt'), sColor.cmyk.magenta);
            colorDesc.putDouble( charIDToTypeID('Ylw'), sColor.cmyk.yellow );
            colorDesc.putDouble( charIDToTypeID('Blck'), sColor.cmyk.black );
return fillcolor;
}
 
Что значит не работает? На чтото ругается или как?
 
  • Спасибо
Реакции: Deniks
PHP:
#target photoshop

// Исходный цвет
var sourceColor = new SolidColor;
    sourceColor.cmyk.cyan= 60;
    sourceColor.cmyk.magenta = 60;
    sourceColor.cmyk.yellow = 40;
    sourceColor.cmyk.black = 100;

// Целевой цвет  
var targetColor = new SolidColor;
    targetColor.cmyk.cyan= 60;
    targetColor.cmyk.magenta = 40;
    targetColor.cmyk.yellow = 40;
    targetColor.cmyk.black = 100;

// Обходим все слои
for ( var i = 0; i < app.activeDocument.layers.length; i++ )
{
    var actLayer = app.activeDocument.layers[i];
    app.activeDocument.activeLayer = actLayer;
    if ( actLayer.kind == LayerKind.SOLIDFILL ) { // Если слой является шейпом
        if ( colorToString( getFillColor() ) == colorToString( sourceColor )) { // и его цвет совпадает с исходным,
            setColorOfFillLayer( targetColor ); // то перекрашиваем его в целевой.
        }
    }
}

// Устанавливаем цвет шейпа
function setColorOfFillLayer( sColor ) {
    var desc = new ActionDescriptor();
        var ref = new ActionReference();
        ref.putEnumerated( stringIDToTypeID('contentLayer'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );
    desc.putReference( charIDToTypeID('null'), ref );
        var fillDesc = new ActionDescriptor();
            var colorDesc = new ActionDescriptor();
            colorDesc.putDouble( charIDToTypeID('Cyn '), sColor.cmyk.cyan );
            colorDesc.putDouble( charIDToTypeID('Mgnt'), sColor.cmyk.magenta );
            colorDesc.putDouble( charIDToTypeID('Ylw '), sColor.cmyk.yellow );
            colorDesc.putDouble( charIDToTypeID('Blck'), sColor.cmyk.black );
        fillDesc.putObject( charIDToTypeID('Clr '), charIDToTypeID('CMYC'), colorDesc );
    desc.putObject( charIDToTypeID('T   '), stringIDToTypeID('solidColorLayer'), fillDesc );
    executeAction( charIDToTypeID('setd'), desc, DialogModes.NO );
}

// Получаем цвет шейпа
function getFillColor(){
var ref = new ActionReference();
   ref.putEnumerated( stringIDToTypeID( "contentLayer" ), charIDToTypeID( "Ordn" ), charIDToTypeID( "Trgt" ));
var ref1= executeActionGet( ref );
var list =  ref1.getList( charIDToTypeID( "Adjs" ) ) ;
var solidColorLayer = list.getObjectValue(0);      
var color = solidColorLayer.getObjectValue(charIDToTypeID('Clr '));
var fillcolor = new SolidColor;
   fillcolor.cmyk.cyan = color.getDouble(charIDToTypeID('Cyn '));
   fillcolor.cmyk.magenta = color.getDouble(charIDToTypeID('Mgnt'));
   fillcolor.cmyk.yellow = color.getDouble(charIDToTypeID('Ylw '));
   fillcolor.cmyk.black = color.getDouble(charIDToTypeID('Blck'));
return fillcolor;
}

// Приводим цвет к строке для сравнения
function colorToString(color) {
    var result = color.cmyk.cyan.toString() + "-" + 
                 color.cmyk.magenta.toString() + "-" +
                 color.cmyk.yellow.toString() + "-" +
                 color.cmyk.black.toString();
     return result;
}
 
  • Спасибо
Реакции: Deniks
Правда, почему-то открыл скрытые слои. Ещё в документе, цвет который надо заменить, присутствует в эффекте - наложение цвета (на некоторых слоях), его как-то можно тоже зацепить?
 
Правда, почему-то открыл скрытые слои. Ещё в документе, цвет который надо заменить, присутствует в эффекте - наложение цвета (на некоторых слоях), его как-то можно тоже зацепить?
Пример приложите
 
По идее, операция назначения цвета эффекту наложения скриптуется:
Код:
var id11 = charIDToTypeID( "setd" );
    var desc4 = new ActionDescriptor();
    var id12 = charIDToTypeID( "null" );
        var ref3 = new ActionReference();
        var id13 = charIDToTypeID( "Prpr" );
        var id14 = charIDToTypeID( "Lefx" );
        ref3.putProperty( id13, id14 );
        var id15 = charIDToTypeID( "Lyr " );
        var id16 = charIDToTypeID( "Ordn" );
        var id17 = charIDToTypeID( "Trgt" );
        ref3.putEnumerated( id15, id16, id17 );
    desc4.putReference( id12, ref3 );
    var id18 = charIDToTypeID( "T   " );
        var desc5 = new ActionDescriptor();
        var id19 = charIDToTypeID( "Scl " );
        var id20 = charIDToTypeID( "#Prc" );
        desc5.putUnitDouble( id19, id20, 416.666667 );
        var id21 = charIDToTypeID( "SoFi" );
            var desc6 = new ActionDescriptor();
            var id22 = charIDToTypeID( "enab" );
            desc6.putBoolean( id22, true );
            var id23 = charIDToTypeID( "Md  " );
            var id24 = charIDToTypeID( "BlnM" );
            var id25 = charIDToTypeID( "Nrml" );
            desc6.putEnumerated( id23, id24, id25 );
            var id26 = charIDToTypeID( "Opct" );
            var id27 = charIDToTypeID( "#Prc" );
            desc6.putUnitDouble( id26, id27, 100.000000 );
            var id28 = charIDToTypeID( "Clr " );
                var desc7 = new ActionDescriptor();
                var id29 = charIDToTypeID( "Cyn " );
                desc7.putDouble( id29,60 );
                var id30 = charIDToTypeID( "Mgnt" );
                desc7.putDouble( id30, 60 );
                var id31 = charIDToTypeID( "Ylw " );
                desc7.putDouble( id31, 40 );
                var id32 = charIDToTypeID( "Blck" );
                desc7.putDouble( id32, 100 );
            var id33 = charIDToTypeID( "CMYC" );
            desc6.putObject( id28, id33, desc7 );
        var id34 = charIDToTypeID( "SoFi" );
        desc5.putObject( id21, id34, desc6 );
    var id35 = charIDToTypeID( "Lefx" );
    desc4.putObject( id18, id35, desc5 );
executeAction( id11, desc4, DialogModes.NO );
Вопрос другой - а как получить текущий цвет наложения, да и вообще, проверить тот факт, что данный эффект на слое присутствует? Задача, возможно, и принципиально выполнимая, но навскидку кажется нетривиальной. *(
 
  • Спасибо
Реакции: Deniks
Спасибо, работает. Т.е. он перекрашивает все слои с эффектом наложения любого цвета, а не только того который нам нужен. А как для эффекта обводки будет?
 
Т.е. он перекрашивает все слои с эффектом наложения любого цвета, а не только того который нам нужен.
Чтобы работало только для заданного цвета,необходимо каким то образом получать наличие эффектов слоя и их цвет - а это, повторяю
Задача, возможно, и принципиально выполнимая, но навскидку кажется нетривиальной.
А как для эффекта обводки будет?
Вот для обоих:
Код:
var id115 = charIDToTypeID( "setd" );
    var desc25 = new ActionDescriptor();
    var id116 = charIDToTypeID( "null" );
        var ref8 = new ActionReference();
        var id117 = charIDToTypeID( "Prpr" );
        var id118 = charIDToTypeID( "Lefx" );
        ref8.putProperty( id117, id118 );
        var id119 = charIDToTypeID( "Lyr " );
        var id120 = charIDToTypeID( "Ordn" );
        var id121 = charIDToTypeID( "Trgt" );
        ref8.putEnumerated( id119, id120, id121 );
    desc25.putReference( id116, ref8 );
    var id122 = charIDToTypeID( "T   " );
        var desc26 = new ActionDescriptor();
        var id123 = charIDToTypeID( "Scl " );
        var id124 = charIDToTypeID( "#Prc" );
        desc26.putUnitDouble( id123, id124, 416.666667 );
        var id125 = charIDToTypeID( "SoFi" );
            var desc27 = new ActionDescriptor();
            var id126 = charIDToTypeID( "enab" );
            desc27.putBoolean( id126, true );
            var id127 = charIDToTypeID( "Md  " );
            var id128 = charIDToTypeID( "BlnM" );
            var id129 = charIDToTypeID( "Nrml" );
            desc27.putEnumerated( id127, id128, id129 );
            var id130 = charIDToTypeID( "Opct" );
            var id131 = charIDToTypeID( "#Prc" );
            desc27.putUnitDouble( id130, id131, 100.000000 );
            var id132 = charIDToTypeID( "Clr " );
                var desc28 = new ActionDescriptor();
                var id133 = charIDToTypeID( "Cyn " );
                desc28.putDouble( id133, 60.000000 );
                var id134 = charIDToTypeID( "Mgnt" );
                desc28.putDouble( id134, 40.000000 );
                var id135 = charIDToTypeID( "Ylw " );
                desc28.putDouble( id135, 40.000000 );
                var id136 = charIDToTypeID( "Blck" );
                desc28.putDouble( id136, 100.000000 );
            var id137 = charIDToTypeID( "CMYC" );
            desc27.putObject( id132, id137, desc28 );
        var id138 = charIDToTypeID( "SoFi" );
        desc26.putObject( id125, id138, desc27 );
        var id139 = charIDToTypeID( "FrFX" );
            var desc29 = new ActionDescriptor();
            var id140 = charIDToTypeID( "enab" );
            desc29.putBoolean( id140, true );
            var id141 = charIDToTypeID( "Styl" );
            var id142 = charIDToTypeID( "FStl" );
            var id143 = charIDToTypeID( "OutF" );
            desc29.putEnumerated( id141, id142, id143 );
            var id144 = charIDToTypeID( "PntT" );
            var id145 = charIDToTypeID( "FrFl" );
            var id146 = charIDToTypeID( "SClr" );
            desc29.putEnumerated( id144, id145, id146 );
            var id147 = charIDToTypeID( "Md  " );
            var id148 = charIDToTypeID( "BlnM" );
            var id149 = charIDToTypeID( "Nrml" );
            desc29.putEnumerated( id147, id148, id149 );
            var id150 = charIDToTypeID( "Opct" );
            var id151 = charIDToTypeID( "#Prc" );
            desc29.putUnitDouble( id150, id151, 100.000000 );
            var id152 = charIDToTypeID( "Sz  " );
            var id153 = charIDToTypeID( "#Pxl" );
            desc29.putUnitDouble( id152, id153, 3.000000 );
            var id154 = charIDToTypeID( "Clr " );
                var desc30 = new ActionDescriptor();
                var id155 = charIDToTypeID( "Cyn " );
                desc30.putDouble( id155, 60.000000 );
                var id156 = charIDToTypeID( "Mgnt" );
                desc30.putDouble( id156, 60.000000 );
                var id157 = charIDToTypeID( "Ylw " );
                desc30.putDouble( id157, 40.000000 );
                var id158 = charIDToTypeID( "Blck" );
                desc30.putDouble( id158, 100.000000 );
            var id159 = charIDToTypeID( "CMYC" );
            desc29.putObject( id154, id159, desc30 );
        var id160 = charIDToTypeID( "FrFX" );
        desc26.putObject( id139, id160, desc29 );
    var id161 = charIDToTypeID( "Lefx" );
    desc25.putObject( id122, id161, desc26 );
executeAction( id115, desc25, DialogModes.NO );
 
Работает, только если толщина обводки другая, он её 3 px ставит, а как чтобы оставлял прежнюю толщину?
 
По идее, можно стандартным проверенным способом получить и распотрошить параметры слоя
Код:
var typeOrdinal      = charIDToTypeID('Ordn');
var enumTarget       = charIDToTypeID('Trgt');
var ID       = 'Lyr ';

var ref = new ActionReference();
ref.putEnumerated(charIDToTypeID(ID), typeOrdinal, enumTarget);

var lr=app.executeActionGet(ref);
и в дремучей куче фарша поискать эффекты, но это весьма серьезная задача.
 
в сс версии фотошопа в палитре слоёв можно отобразить только шейпы, выбрать их, нажать А, и перекрасить как нужно и заливку и обводку...
 

Вложения

  • 1.png
    1.png
    803.3 КБ · Просм.: 901
  • 2.png
    2.png
    87.4 КБ · Просм.: 877
в дремучей куче фарша
Один хороший человек уже спас нас от этой участи. У него на сайте много вкусного :)
PHP:
//@includepath "~/JSON Action Manager/"
//@include "jamActions.jsxinc"
//@include "jamEngine.jsxinc"
//@include "jamJSON.jsxinc"
//@include "jamStyles.jsxinc"
//@include "jamUtils.jsxinc"

// Copyright: © 2013-2015 Michel MARIANI <http://www.tonton-pixel.com/blog/>
// Licence: GPL <http://www.gnu.org/licenses/gpl.html>

// Исходный цвет
var sourceColor = new SolidColor;
sourceColor.cmyk.cyan = 0;
sourceColor.cmyk.magenta = 100;
sourceColor.cmyk.yellow = 0;
sourceColor.cmyk.black = 0;

// Целевой цвет
var targetColor = new SolidColor;
targetColor.cmyk.cyan = 100;
targetColor.cmyk.magenta = 0;
targetColor.cmyk.yellow = 0;
targetColor.cmyk.black = 0;

var layerStyleObj = jamStyles.getLayerStyle();
if (layerStyleObj) {
  if ("layerEffects" in layerStyleObj) {
    var layerEffectsObj = layerStyleObj["layerEffects"];
    if ("frameFX" in layerEffectsObj) doIt("frameFX"); 
    if ("solidFill" in layerEffectsObj) doIt("solidFill");
  }
}

function doIt(effectStr) {
  if (effectStr in layerEffectsObj) {
    var EffectObj = layerEffectsObj[effectStr];
    var ColorObj = EffectObj["color"];
    if (compareColors(ColorObj, sourceColor)) {
      ColorObj = setColor(ColorObj, targetColor);
    }
    jamStyles.setLayerStyle(layerStyleObj);
  } else {
    alert("No " + effectStr + " effect.");
  }
};

function compareColors(colObj, srcCol) {
  var result = (colObj["cyan"] == srcCol.cmyk.cyan &&
    colObj["magenta"] == srcCol.cmyk.magenta &&
    colObj["yellowColor"] == srcCol.cmyk.yellow &&
    colObj["black"] == srcCol.cmyk.black) ? true : false;
  return result;
}

function setColor(colObj, trgCol) {
  colObj["cyan"] = trgCol.cmyk.cyan;
  colObj["magenta"] = trgCol.cmyk.magenta;
  colObj["yellowColor"] = trgCol.cmyk.yellow;
  colObj["black"] = trgCol.cmyk.black;
  return colObj;
}
 
Инклюды только приложить осталось ;)
 
Ну, я ж оставил копирайт со ссылкой..
 
Статус
Закрыто для дальнейших ответов.