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
En este ejemplo, el hexadecimal sería 00ff00
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.
¡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 selectColorRange
para 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.
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.
Joonas
estegatesaurio
Joonas
Vicente