Scripting Illustrator Parte 2 - Come fondere un gradiente in un colore di processo piatto

Nella parte 1 di questa serie di tutorial in due parti, abbiamo imparato come codificare uno script che converte un colore di processo piatto nel suo gradiente di corrispondenza. In questo tutorial, impareremo a codificare uno script che converte un riempimento sfumato in un colore di quadricromia. Fonderemo il colore sfumato disponibile in un colore di quadricromia, che sarà una miscela di tutti i colori disponibili in quella sfumatura.

L'intera operazione verrà eseguita tramite script JavaScript per Illustrator. Il tutorial presume che tu abbia familiarità con le basi dello scripting. Per coloro che sono direttamente approdati a questo tutorial, abbiamo un piccolo know-how relativo ai Javascrip di Illustrator nella Parte 1 di questa serie. Quindi senza ulteriori ritardi, iniziamo!

Vector Plus

Vuoi accedere ai file Vector Source completi e alle copie scaricabili di ogni tutorial, incluso questo? Unisciti a Vector Plus per soli 9 $ al mese.

Dettagli dell'esercitazione

  • Programma: Adobe Illustrator e ExtendedScript Toolkit
  • Versione: CS3
  • Difficoltà: intermedia
  • Tempo di completamento stimato: da 3 a 4 ore

Scopo dello Script

Vogliamo che questo script esegua un compito molto semplice. In Adobe Illustrator, quando un utente seleziona alcuni oggetti riempiti con un Colore sfumato CMYK ed esegue questo Script; gli oggetti devono essere convertiti in un riempimento CMYK piatto. Questo riempimento piano sarà la miscela di tutti i colori disponibili nella precedente sfumatura. Vedi l'immagine qui sotto per chiarimenti.

Quindi, lo scopo del nostro script è convertire un riempimento CMYK gradiente in un riempimento CMYK piatto.

Logica e Algoritmo

La logica per fondere i colori di un gradiente in un singolo colore è semplice e diretta. Selezioneremo tutti i colori dal gradiente, troveremo la loro media e li assegneremo all'oggetto come un nuovo colore. Possiamo capirlo in cinque fasi, come mostrato di seguito:

  • Passo 1: Scegli il colore dell'oggetto corrente. vale a dire currentColor = colore dell'oggetto attualmente selezionato.
  • Passo 2: Contare il numero di arresti del gradiente nel colore corrente.
  • Passaggio 3: Ad ogni arresto del gradiente, selezionare il colore associato e i relativi valori CMYK.
  • Passaggio 4: Calcola il valore CMYK medio per tutti i colori disponibili in diverse fermate.
  • Passaggio 5:
    Assegna questo valore CMYK medio come un nuovo colore all'oggetto.

L'algoritmo di cui sopra può essere facilmente compreso dalla seguente rappresentazione pittorica.

Abbiamo visto una breve panoramica della logica. Iniziamo con la codifica.

Passaggio 1: iniziare con la struttura del codice

Apri ExtendedScript Toolkit e crea un nuovo file Javascript (Command + N). Quindi, selezionare Adobe Illustrator per l'applicazione di destinazione.

Nell'area di modifica del codice, aggiungere la seguente struttura di codice per determinate convalide e controlli pre-requisito.

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Converti gli oggetti in CMYK prima", "Conversione CMYK richiesta");  // end main if else alert ("Nessun documento è disponibile o il documento è vuoto"); 

Stiamo verificando se esiste almeno un documento con almeno un oggetto, in modo che possiamo lavorarci sopra. Successivamente, stiamo controllando se la modalità colore del documento è CMYK o meno. Questo è un passaggio essenziale perché tutta la logica per la conversione del colore in questo script si basa sui colori CMYK. convertToFlat () è la funzione principale che conterrà tutta la logica. Quindi, salva questo file come test.jsx.

Passo 2

Iniziamo ora con la funzione principale - convertToFlat (). Controlleremo se qualche elemento è selezionato o meno, perché questo script funzionerà solo sugli oggetti selezionati. Quindi, aggiungi le seguenti righe di codice a "test.jsx".

 function convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // procedi con la logica principale else alert ("Please select atleast one object");  // end convertToGrad

Passaggio 3

Successivamente, inizieremo un ciclo all'interno del "se (totaleSelezionato> 0)msgstr "Questo ciclo conterrà la logica di conversione del colore, che viene ripetuta per ciascun elemento selezionato, ma prima della logica di conversione del colore, aggiungiamo un po 'più di convalide e controlli all'interno di quel ciclo.

 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

Per ogni articolo selezionato, stiamo controllando se si tratta di un percorso composto o di un articolo di gruppo. In tal caso, lo script non verrà più eseguito e restituirà un messaggio di avviso. Inoltre, stiamo controllando se il tipo di riempimento dell'elemento selezionato è qualcosa di diverso dal riempimento sfumato. Ad esempio, se è un colore spot, un colore CMYK piatto o un motivo; la sceneggiatura deve restituire un avviso. Questi controlli vengono eseguiti perché il nostro script funziona solo per gli elementi del percorso non composto con gradiente pieno.
Successivamente, modificheremo il blocco di conversione del colore.

Passaggio 4

A questo punto, abbiamo bisogno di estrarre i singoli valori di C, M, Y e K per i colori che risiedono a diversi gradienti di gradiente. Per questo, creeremo alcune variabili che manterranno i singoli valori CMYK. Quindi, aggiungi le seguenti dichiarazioni variabili appena all'interno del blocco di conversione del colore:

 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;

Vedremo il ruolo di ogni variabile uno per uno:

  • currentColor memorizzerà il colore di riempimento (gradiente) dell'oggetto attualmente selezionato.
  • numOfStops contiene il numero totale di interruzioni di sfumatura disponibili nell'oggetto attualmente selezionato. Questo sarà usato per trovare la media dei valori dei colori nelle fasi successive.
  • scatola dei colori è una matrice che manterrà il valore del colore di riempimento per tutti gli arresti del gradiente. cioè se numOfStops è quattro.
  • scatola dei colori l'array conterrà quattro colori.
  • cyanBox è un array che contiene valori cyan per ogni colore su diversi gradienti.
  • allo stesso modo, magentaBox, Yellowbox e
    scatola nera mantenere i rispettivi valori di colore per ciascun colore su diversi gradienti.
  • Graybox è un array che mantiene i valori di grigio per il colore su qualsiasi arresto del gradiente. Questo è essenziale perché il colore grigio è una specifica diversa dalla specifica del colore CMYK. Nel caso in cui un oggetto contenga una sfumatura grigia, gestiremo la situazione separatamente facendo uso di questa variabile.
  • Finalmente, abbiamo cyanTotal, magentaTotal, yellowTotal, blackTotal e grayTotal. Queste variabili contengono la somma di tutti i valori ciano, magenta, giallo, nero o grigio rispettivamente.

Passaggio 5

Abbiamo eseguito le convalide e i controlli. Abbiamo anche creato i contenitori necessari per contenere i valori dei colori. Successivamente, eseguiremo un ciclo che legge ciascun gradiente di arresto uno per uno. Per questo, crea un ciclo, come mostrato di seguito:

 per (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 restituisce il colore di una particolare sfumatura per ogni iterazione di k.

Per ogni arresto del gradiente, stiamo controllando se il colore disponibile è a Colore grigio specifica o a CMYKColor specifica. A seconda di ciò, implementeremo la nostra logica.

Passaggio 6: somma dei valori dei colori grigi

Dentro il "se blocco"per Colore grigio specifica, aggiungi le seguenti righe di codice:

 grayBox [k] = Math.round (colorBox [k] .gray); grayTotal = grayTotal + grayBox [k];

Quindi, Graybox [k] manterrà tutti i valori di grigio per ciascun colore nei rispettivi intervalli di sfumatura.
Il prossimo, grayTotal sarà la somma di questi valori di colore grigio, che verranno utilizzati in seguito.

Passaggio 7: somma dei valori di colore CMYK

Dentro il "altro blocco"per CMYKColor specifica, aggiungi le seguenti righe di codice:

 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];

Per capire cosa viene eseguito qui, faremo un esempio di colore ciano. cyanBox [k] sta memorizzando i valori cyan per tutti i colori che si trovano a diversi gradienti. Il prossimo, cyanTotal è la somma di tutti questi valori cyan memorizzati cyanBox [k].

Un'operazione simile viene eseguita anche per il magenta, il giallo e il nero. Una volta completata la sommatoria, possiamo uscire dal ciclo e procedere in media.

Passaggio 8: calcolo della media dei valori del colore

Abbiamo raccolto la somma individuale di colore grigio e CMYKColor per tutte le fermate del gradiente. Ora dobbiamo fare una media di loro. Per quello, chiudi il "per ciclo k"e inserisci le seguenti righe di codice subito dopo il braccialetto di chiusura di"per ciclo k", come mostrato di seguito:

  // end per 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);

Nelle righe di codice sopra, dividiamo le singole sommatorie di C, M, Y e K di numOfStops. Ad esempio, se ci fossero cinque stop di gradiente, divideremo la somma dei singoli valori di C, M, Y e K con cinque. In tal modo, restituendo una media di cinque valori. Questi valori medi sono memorizzati come newCyan, newMagenta, newYellow e newBlack rispettivamente.

Nota il caso delicato di grigio e nero qui. La somma di K non è giusta blackTotal. Piuttosto, è una somma di grayTotal e blackTotal.

Perché lo abbiamo fatto? Ci sono casi in cui un riempimento sfumato può contenere sia gli arresti di GrayColor che gli arresti CMYK. In tal caso, i valori di Colore grigio vengono aggiunti al valore K del colore CMYK. Il grigio non può essere aggiunto a ciano, magenta o giallo. Cadrà solo nella categoria di K.

Ora abbiamo tutti i nuovi valori mediati per C, M, Y e K in mano. Nel passaggio successivo, implementeremo questi valori come un nuovo colore CMYK sull'oggetto corrente.

Passaggio 9: implementazione del nuovo colore

Per implementare il nuovo colore, creeremo un nuovo CMYKColor oggetto e modifica i suoi valori C, M, Y e K a quelli che abbiamo appena calcolato nel passaggio 7. Per fare ciò, aggiungi le seguenti righe di codice:

 var newColor = new CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;

Abbiamo creato un newColor oggetto e assegnato i valori di newCyan, newMagenta, newYellow e newBlack come i suoi valori C, M, Y e K rispettivamente.

Successivamente, abbiamo assegnato il newColor come un colore di riempimento all'oggetto corrente. Quindi, il nostro codice finale sarà simile a quello seguente:

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Converti gli oggetti in CMYK prima", "Conversione CMYK richiesta");  // end main if else alert ("Nessun documento è disponibile o il documento è vuoto");  function 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

Passaggio 10: Esecuzione dello script

Salva questo script come "test.jsx" e apri Adobe Illustrator. Successivamente, crea alcuni oggetti con riempimenti sfumati colorati. Ora per testare questo script, seleziona alcuni oggetti e vai su File> Script> Altro script (comando + F12) e trova questo script.

Dopo aver eseguito correttamente lo script, dovresti vedere una fusione dei gradienti; qualcosa di simile a questo:

Conclusione e ambito

In questo tutorial, abbiamo visto come fondere un gradiente in un riempimento di colore piatto con l'aiuto degli script. Questo script può essere utile nei casi in cui è necessario trovare la media di due o più colori. Ma il frutto di questo tutorial è capire le basi dello scripting e la loro implementazione con Illustrator.

C'è una vasta gamma di creatività vettoriale e innovazione attraverso lo scripting. Spero che questa serie di tutorial in due parti ispirerà i lettori e gli autori a portare avanti l'essenza dello scripting. Grazie per il tuo prezioso tempo nella lettura di questo tutorial.

Iscriviti al feed RSS di Vectortuts + per rimanere aggiornato con le ultime esercitazioni e articoli vettoriali.