Script de Photoshop para seleccionar colores específicos

Tenga en cuenta que soy un principiante completo y esta es mi primera pregunta de codificación. Si esto es más apropiado en otro sitio, dímelo.

Quiero automatizar un proceso donde el programa selecciona un color y lo cambia a otro.

Este es el código que tengo, gracias al script listener:

var id159 = charIDToTypeID( "ClrR" );
var desc34 = new ActionDescriptor(); 
var id160 = charIDToTypeID( "Fzns" );
desc34.putInteger( id160, 0 ); 
var id161 = charIDToTypeID( "Mnm " );
    var desc35 = new ActionDescriptor();
    var id162 = charIDToTypeID( "Rd  " );
    desc35.putDouble( id162, 0.000000 );
    var id163 = charIDToTypeID( "Grn " );
    desc35.putDouble( id163, 255.000000 );
    var id164 = charIDToTypeID( "Bl  " );
    desc35.putDouble( id164, 0.000000 );
var id165 = charIDToTypeID( "RGBC" );
desc34.putObject( id161, id165, desc35 ); 
var id166 = charIDToTypeID( "Mxm " );
    var desc36 = new ActionDescriptor();
    var id167 = charIDToTypeID( "Rd  " );
    desc36.putDouble( id167, 0.000000 );
    var id168 = charIDToTypeID( "Grn " );
    desc36.putDouble( id168, 255.000000 );
    var id169 = charIDToTypeID( "Bl  " );
    desc36.putDouble( id169, 0.000000 );
var id170 = charIDToTypeID( "RGBC" );
desc34.putObject( id166, id170, desc36 ); executeAction( id159, desc34, DialogModes.NO );

Cuando ejecuto esto en Photoshop, funciona, pero como tengo muchos colores para seleccionar, quiero saber

  1. Si hay una forma más eficiente de hacerlo, usando menos líneas de código. Puede ser con la gama de colores o con otra herramienta.
  2. Preferiría usar valores hexadecimales pero no tengo idea de cómo escribirlo. Logré cambiarlo a RGB pero originalmente usaba colores Lab.

En este ejemplo, el hexadecimal sería 00ff00

Esto podría ayudarte... Hice esto como un ejemplo para otra persona hace algún tiempo: gist.github.com/joonaspaakko/347c270f15bc1d11efe9 - Utiliza la lista de códigos hexadecimales definidos en la parte superior para cambiar el color de primer plano en PS. Escribe un archivo de texto en la misma carpeta donde está la secuencia de comandos para realizar un seguimiento de qué color se utilizó (según el número de índice). Entonces, cada vez que ejecuta el script, elige el siguiente color, lo aplica al primer plano, escribe un nuevo número en el archivo temporal y se repite una vez que llega al final. Creo que fue probado en PS CC.
Miré el duplicado sugerido y leí de nuevo lo que dijiste. Quiero señalar que hay un par de "Global Swatch Extensions" para PS: ColorKit y Prisma . Si sabe cómo funcionan las muestras globales en Indesign o Illustrator, sabrá cómo funcionan estas extensiones. Una breve explicación: usa la extensión para aplicar/vincular un color a un texto o una forma y si alguna vez cambia el color de la extensión, se cambia en cualquier lugar donde se haya aplicado ese color.
@Joonas ¡Gracias! Le echaré un vistazo cuando pase un rato más.

Respuestas (1)

Esto es más un comentario largo que una respuesta. No estoy seguro de que seleccionar la gama de colores sea la mejor manera de reemplazar el color, pero sí, podría hacerlo.

  1. ¡El número de líneas no hace que el código sea más eficiente! Una línea de código bien puede ser menos eficiente que 100. Además, hay un código debajo del código, por lo que no es como si su lenguaje de secuencias de comandos fuera a toda máquina. Además, la API de secuencias de comandos es intrínsecamente ineficiente si le importa la velocidad, entonces es hora de comenzar a escribir C ++ y usar la API del complemento de Photoshop.

    Sin embargo, entenderé que te refieres a más práctico. Sí, podemos definir algunas funciones para que sea más fácil de leer y usar, llamar y condensar un poco más. Aunque hacerlo más práctico aumentará ligeramente la longitud, pero esto no es significativo para usted. Así que refactoricemos el código:

    #target photoshop
    
    selectColorRange(
        RGBc(0.0, 255.0, 0.0),
        RGBc(0.0, 255.0, 0.0)
    );
    
    
    /******* Support functions *******/
    
    function cTID(s) { return app.charIDToTypeID(s); }
    function sTID(s) { return app.stringIDToTypeID(s); }
    
    function RGBc(r, g, b) {
        var color = new ActionDescriptor();
            color.putDouble( cTID("Rd  "), r);
            color.putDouble( cTID("Grn "), g);
            color.putDouble( cTID("Bl  "), b);   
        return color
    }
    
    function selectColorRange(color1, color2){
        var desc = new ActionDescriptor(); 
        desc.putInteger(cTID("Fzns"), 0 ); 
        desc.putObject( cTID("Mnm "), cTID("RGBC"), color1 ); 
        desc.putObject( cTID("Mxm "), cTID("RGBC"), color2 ); 
        executeAction( cTID("ClrR"), desc, DialogModes.NO );
    }
    

    Entonces, desde su punto de vista, el código es solo selectColorRange. Obviamente, si solo tiene la intención de seleccionar un solo color, entonces puede cambiar selectColorRangepara tomar solo una entrada.

    Además, incluso si Adobe tuviera esto como una función u objeto javascipt, su código probablemente no sería más de 3 líneas más corto. Dado que los objetos deben poblarse de todos modos.

  2. Bueno, esto es bastante fácil, puedes encontrar muchas implementaciones de esto buscando en Google. Así que definimos una función para hacer esto:

    function hexC(hex) {
        // http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
        hex = hex.substring(1,7)
        bigint = parseInt(hex, 16);
        var color = new ActionDescriptor()
            color.putDouble(cTID("Rd  "), (bigint >> 16) & 255);
            color.putDouble(cTID("Grn "), (bigint >> 8) & 255);
            color.putDouble(cTID("Bl  "), bigint & 255);
        return color
    }
    

    Entonces llamarías a hexC así,

    colorReplace(
         hexC("#00ff00"),
         hexC("#00ff00")
    );
    

    en lugar de RGBc.

Ok, ahora tenemos todas las piezas en su código en su lugar. Si tiene muchos colores, simplemente llame a un bucle for.