En la Parte 1 de esta serie de tutoriales de dos partes, aprendimos cómo codificar un script que convierte un color de proceso plano en su gradiente correspondiente. En este tutorial, aprenderemos a codificar una secuencia de comandos que convierte un relleno degradado en un color de proceso plano. Fundiremos el color de degradado disponible en un color de proceso plano, que será una mezcla de todos los colores disponibles en ese degradado..
Toda esta tarea se realizará a través de un script de JavaScript para Illustrator. El tutorial asume que estás familiarizado con los conceptos básicos de las secuencias de comandos. Para aquellos que han llegado directamente a este tutorial, tenemos un poco de conocimiento sobre los Javascripts de Illustrator en la Parte 1 de esta serie. Así que sin más retrasos, vamos a empezar.!
¿Desea acceder a los archivos completos de Vector Source y las copias descargables de cada tutorial, incluido este? Únete a Vector Plus por solo 9 $ al mes.
Queremos que este script realice una tarea muy simple. En Adobe Illustrator, cuando un usuario selecciona algunos objetos rellenos con un Color de degradado CMYK y ejecuta este Script; los objetos se convertirán en un relleno plano CMYK. Este relleno plano será la mezcla de todos los colores disponibles en el gradiente anterior. Vea la imagen de abajo para aclaración.
Por lo tanto, el objetivo de nuestro script es convertir un relleno CMYK degradado en un relleno CMYK plano.
La lógica para fundir los colores de un degradado en un solo color es simple y directa. Seleccionaremos todos los colores del degradado, encontraremos su promedio y los asignaremos como un nuevo color. Podemos entender esto en cinco pasos, como se muestra a continuación:
El algoritmo anterior se puede entender fácilmente a partir de la representación pictórica a continuación.
Hemos visto un breve resumen de la lógica. Empecemos con la codificación..
Abra el Kit de herramientas ExtendedScript y cree un nuevo archivo Javascript (Comando + N). A continuación, seleccione Adobe Illustrator para la aplicación de destino.
En el área de edición de código, agregue la siguiente estructura de código para ciertas validaciones y verificaciones de requisitos previos.
if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Convertir los objetos en CMYK primero", "Se requiere conversión CMYK"); // end main main si alert "(O no hay ningún documento disponible o el documento está vacío");
Estamos comprobando si al menos un documento con al menos un objeto existe, para que podamos trabajar en él. A continuación, estamos comprobando si el modo de color del documento es CMYK o no. Este es un paso esencial porque toda la lógica para la conversión de color en este script se basa en los colores CMYK.. convertToFlat ()
Es la función principal que contendrá toda la lógica. A continuación, guarde este archivo como test.jsx.
Empecemos ahora con la función principal. - convertToFlat ()
. Comprobaremos si algún elemento está seleccionado o no, porque esta secuencia de comandos funcionará solo en los objetos seleccionados. Por lo tanto, agregue las siguientes líneas de código a "test.jsx".
función convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // prosiga con la lógica principal else alert ("Seleccione al menos un objeto"); // finalizar convertToGrad
A continuación, comenzaremos un bucle dentro de "if (totalSelected> 0)
"bloque. Este bucle contendrá la lógica de conversión de color, que se repite para cada elemento seleccionado. Pero justo antes de la lógica de conversión de color, agreguemos algunas validaciones más y verificaciones dentro de ese bucle.
if (totalSelected> 0) for (var j = 0; j < totalSelected; j++) var currentObject = app.activeDocument.selection[j]; if(currentObject.typename != "CompoundPathItem" && currentObject.typename != "GroupItem") if(currentObject.filled==true && currentObject.fillColor.typename != "CMYKColor" && currentObject.fillColor.typename != "PatternColor" && currentObject.fillColor.typename != "SpotColor") // Color conversion Block //endif else alert("Fill an object with CMYK or Grayscale Gradient. Flat Colors, Patterns, Spot Colors and Empty Fills are not allowed."," Only Gradients Allowed"); //endif else alert("This script only works with Non-Compound Objects or Isolated Group items.\nAny items with Groups or Compound Objects will be omitted.", "Ungroup or Isolate the Group Items"); //endfor // endif
Para cada elemento seleccionado, estamos comprobando si se trata de una ruta compuesta o un elemento de grupo. Si es así, el script no se ejecutará más y devolverá un mensaje de alerta. Además, estamos verificando si el tipo de relleno del elemento seleccionado es diferente al Relleno de degradado. es decir, si es un color plano, un color plano CMYK o un patrón; El script devolverá una alerta. Estas comprobaciones se realizan porque nuestra secuencia de comandos solo funcionará para elementos de ruta no compuesta rellenos con gradiente.
A continuación, modificaremos el bloque de conversión de color..
En esta etapa, necesitamos extraer los valores individuales de C, M, Y y K para los colores que residen en las diferentes paradas de degradado. Para eso, crearemos algunas variables que contendrán valores CMYK individuales. Entonces, agregue las siguientes declaraciones de variables justo dentro del bloque de conversión de color:
var currentColor = currentObject.fillColor; var numOfStops = currentColor.gradient.gradientStops.length; var colorBox = []; var cyanBox = []; var magentaBox = []; var yellowBox = []; var blackBox = []; var grayBox = []; var cyanTotal = 0; var magentaTotal = 0; var yellowTotal = 0; var blackTotal = 0; var grayTotal = 0;
Veremos el rol de cada variable uno por uno:
color actual
almacenará el color de relleno (degradado) del objeto seleccionado actualmente.numOfStops
contiene el número total de paradas de degradado disponibles en el objeto seleccionado actualmente. Esto se usará para encontrar el promedio de los valores de color en etapas posteriores.caja de color
es una matriz que mantendrá el valor de color de relleno para todas las paradas de degradado. es decir, si numOfStops
es cuatro.caja de color
matriz contendrá cuatro colores.cianbox
es una matriz que contiene valores cian para cada color en diferentes gradientes..caja magenta
, caja amarilla
ycaja negra
Mantenga sus respectivos valores de color para cada color en diferentes gradientes..caja gris
es una matriz que contiene valores de gris para el color en cualquier tope de degradado. Esto es esencial porque el color gris es una especificación diferente a la especificación de color CMYK. En caso de que un objeto contenga un degradado gris, manejaremos la situación por separado haciendo uso de esta variable.ciantotal
, magenta total
, amarillo total
, negro total
y gris total
. Estas variables contienen la suma de todos los valores de cian, magenta, amarillo, negro o gris, respectivamente.Hemos realizado las validaciones y comprobaciones. También hemos creado los contenedores necesarios para mantener los valores de color. A continuación, ejecutaremos un bucle que lee cada parada de degradado una por una. Para eso, crea un bucle, como se muestra a continuación:
para (var k = 0; k < numOfStops; k++) colorBox[k] = currentColor.gradient.gradientStops[k].color; if(colorBox[k].typename == "GrayColor") // Extract Gray Color values else // Extract CMYK Color values //end for k
currentColor.gradient.gradientStops [k] .color
devuelve el color de una parada de degradado particular para cada iteración de k.
Para cada parada de gradiente, estamos comprobando si el color disponible es un Color gris
especificación o una CMYKColor
especificación. Dependiendo de eso, implementaremos nuestra lógica..
Dentro de "si bloque
" para Color gris
Especificación, agregue las siguientes líneas de código:
grayBox [k] = Math.round (colorBox [k] .gray); grayTotal = grayTotal + grayBox [k];
Por lo tanto, caja gris [k]
mantendrá todos los valores de gris para cada color en sus respectivas paradas de degradado.
Siguiente, gris total
Será la suma de estos valores de color gris, que se utilizarán más adelante..
Dentro de "bloque de otra cosa
" para CMYKColor
Especificación, agregue las siguientes líneas de código:
cyanBox [k] = Math.round (colorBox [k] .cyan); magentaBox [k] = Math.round (colorBox [k] .magenta); yellowBox [k] = Math.round (colorBox [k] .yellow); blackBox [k] = Math.round (colorBox [k] .black); cyanTotal = cyanTotal + cyanBox [k]; magentaTotal = magentaTotal + magentaBox [k]; YellowTotal = yellowTotal + yellowBox [k]; blackTotal = blackTotal + blackBox [k];
Para entender lo que se está realizando aquí, tomaremos un ejemplo del color cian.. cyanBox [k]
está almacenando los valores cian para todos los colores que residen en diferentes gradientes. Siguiente, ciantotal
es la suma de todos estos valores cian que se almacenan en cyanBox [k]
.
Una operación similar se realiza para magenta, amarillo y negro también. Una vez que se haya completado la suma, podemos salir del bucle y avanzar para el promedio.
Hemos reunido la suma individual de color gris
y CMYKColor
Para todas las paradas de gradiente. Ahora necesitamos promediarlos. Para eso, cierra el "para k loop
"e ingrese las siguientes líneas de código justo después del cierre de la pulsera de"para k loop
", Como se muestra abajo:
// end para k loop var finalBlack = blackTotal + grayTotal; var newCyan = Math.round (cyanTotal / numOfStops); var newMagenta = Math.round (magentaTotal / numOfStops); var newYellow = Math.round (yellowTotal / numOfStops); var newBlack = Math.round (finalBlack / numOfStops);
En las líneas de código anteriores, estamos dividiendo sumas individuales de C, M, Y y K por numOfStops
. es decir, si hubiera cinco paradas de gradiente, dividiremos la suma de los valores individuales de C, M, Y y K con cinco. De este modo, se devuelve un promedio de cinco valores. Estos valores promediados se almacenan como nuevoCyan
, nuevoMagenta
, nuevoYellow
y nuevoNegro
respectivamente.
Tenga en cuenta el caso difícil de gris y negro aquí. La suma de K no es solo negro total
. Más bien, es una suma de gris total
y negro total
.
¿Por qué hemos hecho eso?? Hay casos en que un relleno de degradado puede contener tanto paradas de GrayColor como CMYK. En ese caso, los valores de color gris se agregan al valor K del color CMYK. El gris no se puede añadir a cian, magenta o amarillo. Caerá en la categoría de K solamente.
Ahora tenemos todos los nuevos valores promediados para C, M, Y y K en la mano. En el siguiente paso, implementaremos estos valores como un nuevo color CMYK en el objeto actual.
Para implementar el nuevo color, crearemos un nuevo CMYKColor
objetar y modificar sus valores C, M, Y y K a los que acabamos de calcular en el Paso 7. Para hacerlo, agregue las siguientes líneas de código:
var newColor = new CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;
Hemos creado un color nuevo
objeto y asignó los valores de nuevoCyan
, nuevoMagenta
, nuevoYellow
y nuevoNegro
como sus valores C, M, Y y K respectivamente.
A continuación, hemos asignado la color nuevo
como un color de relleno
al objeto actual. Por lo tanto, nuestro código final ahora se verá como el siguiente:
if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Convertir los objetos en CMYK primero", "Se requiere conversión CMYK"); // end main main si alert "(O no hay ningún documento disponible o el documento está vacío"); función convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) for (var j = 0; j < totalSelected; j++) var currentObject = app.activeDocument.selection[j]; if(currentObject.typename != "CompoundPathItem" && currentObject.typename != "GroupItem") if(currentObject.filled == true && currentObject.fillColor.typename != "CMYKColor" && currentObject.fillColor.typename != "PatternColor" && currentObject.fillColor.typename != "SpotColor") var currentColor = currentObject.fillColor; var numOfStops = currentColor.gradient.gradientStops.length; var colorBox=[]; var cyanBox=[]; var magentaBox=[]; var yellowBox=[]; var blackBox=[]; var grayBox =[]; var cyanTotal = 0; var magentaTotal = 0; var yellowTotal = 0; var blackTotal = 0; var grayTotal = 0; for(var k=0; k < numOfStops; k++) colorBox[k] = currentColor.gradient.gradientStops[k].color; if(colorBox[k].typename == "GrayColor") grayBox[k] = Math.round(colorBox[k].gray); grayTotal = grayTotal + grayBox[k]; else cyanBox[k] = Math.round(colorBox[k].cyan); magentaBox[k] = Math.round(colorBox[k].magenta); yellowBox[k] = Math.round(colorBox[k].yellow); blackBox[k] = Math.round(colorBox[k].black); cyanTotal = cyanTotal + cyanBox[k]; magentaTotal = magentaTotal + magentaBox[k]; yellowTotal = yellowTotal + yellowBox[k]; blackTotal = blackTotal + blackBox[k]; //end for k var finalBlack = blackTotal + grayTotal; var newCyan = Math.round(cyanTotal / numOfStops); var newMagenta = Math.round(magentaTotal / numOfStops); var newYellow = Math.round(yellowTotal / numOfStops); var newBlack = Math.round(finalBlack / numOfStops); var newColor = new CMYKColor(); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor; //endif else alert("Fill an object with CMYK or Grayscale Gradient. Flat Colors, Patterns, Spot Colors and Empty Fills are not allowed."," Only Gradients Allowed"); // endif else alert("This script only works with Non-Compound Objects or Isolated Group items.\nAny items with Groups or Compound Objects will be omitted.", "Ungroup or Isolate the Group Items"); //end for j // endif else alert("Please select atleast one object"); //endFunction
Guarde este script como "test.jsx" y abra Adobe Illustrator. A continuación, crea algunos objetos con rellenos coloridos degradados. Ahora, para probar este script, seleccione algunos objetos y vaya a Archivo> Scripts> Otro script (Comando + F12) y localice este script.
Después de la ejecución exitosa de la secuencia de comandos, debería ver una fusión de los gradientes; algo similar a esto:
En este tutorial, hemos visto cómo fundir un degradado en un relleno de color plano con la ayuda de scripts. Este script puede ser útil en los casos en los que necesita encontrar el promedio de dos o más colores. Pero el fruto de este tutorial es comprender los conceptos básicos de las secuencias de comandos y su implementación con Illustrator..
Existe una amplia gama de creatividad e innovación vectorial a través de scripting. Espero que esta serie de tutoriales de dos partes inspire a los lectores y autores a presentar la esencia de las secuencias de comandos. Gracias por su valioso tiempo en leer este tutorial.
Suscríbase a Vectortuts + RSS Feed para estar al día con los últimos tutoriales y artículos de vectores..