Scripting Illustrator, parte 2 cómo fusionar un degradado en un color de proceso plano

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.!

Vector Plus

¿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.

Detalles del tutorial

  • Programa: Adobe Illustrator y ExtendedScript Toolkit
  • Versión: CS3
  • Dificultad: Intermedio.
  • Tiempo estimado de finalización: 3 a 4 horas

Propósito de la escritura

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.

Lógica y algoritmo

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:

  • Paso 1: Elige el color del objeto actual. es decir, currentColor = color del objeto seleccionado actualmente.
  • Paso 2: Cuente el número de paradas de degradado en el color actual.
  • Paso 3: En cada parada de gradiente, elija el color asociado y sus valores CMYK.
  • Etapa 4: Calcule el valor promedio de CMYK para todos los colores disponibles en diferentes paradas.
  • Paso 5:
    Asigne este valor CMYK promedio como un nuevo color al objeto.

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..

Paso 1 - Comenzando con la Estructura del Código

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.

Paso 2

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

Paso 3

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..

Etapa 4

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..
  • similar, caja magenta, caja amarilla y
    caja 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.
  • Finalmente, tenemos 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.

Paso 5

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..

Paso 6 - Suma de los valores de GrayColor

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..

Paso 7 - Suma de los valores de color CMYK

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.

Paso 8 - Promediando los valores de color

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.

Paso 9 - Implementando el Nuevo Color

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

Paso 10 - Ejecutando el Script

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:

Conclusión y alcance

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..