I del 1 av denne todelte opplæringsserien lærte vi å kode et skript som konverterer en flat prosessfarge til den tilsvarende gradienten. I denne opplæringen lærer vi å kode et skript som konverterer en gradientfylling til en flat prosessfarge. Vi vil smelte den tilgjengelige gradientfargen til en flat prosessfarge, som vil være en blanding av alle fargene som er tilgjengelige i den gradienten.
Hele oppgaven vil bli utført via JavaScript-skript for Illustrator. Opplæringen tar utgangspunkt i at du er kjent med grunnleggende om skripting. For de som har landet direkte på denne opplæringen, har vi litt kunnskap om Illustrators Javascripts i Del 1 i denne serien. Så uten ytterligere forsinkelser, la oss komme i gang!
Ønsker du tilgang til hele Vector Source-filene og nedlastbare kopier av hver opplæring, inkludert denne? Bli med Vector Plus for bare 9 $ i måneden.
Vi vil at dette skriptet skal utføre en veldig enkel oppgave. I Adobe Illustrator, når en bruker velger noen objekter fylt med en CMYK Gradient Color, og utfører dette Script; gjenstandene skal konverteres til en flat CMYK-fylling. Denne flate fyllingen vil være en blanding av alle fargene som er tilgjengelige i den tidligere gradienten. Se bildet nedenfor for avklaring.
Derfor er målet med skriptet vårt å konvertere en gradient CMYK-utfylling til en flat CMYK-fylling.
Logikken for å smelte fargene til en gradient i en enkelt farge er enkel og rettferdig. Vi velger alle fargene fra gradienten, finner gjennomsnittet og tildeler objektet som en ny farge. Vi kan forstå dette i fem trinn, som vist nedenfor:
Ovennevnte algoritme kan lett forstås fra bildetillatelsen nedenfor.
Vi har sett en kort oversikt over logikken. La oss begynne med kodingen.
Åpne ExtendedScript Toolkit og opprett en ny Javascript-fil (Command + N). Velg deretter Adobe Illustrator for målprogrammet.
I kodedigeringsområdet legger du til følgende kodestruktur for visse valideringer og forutgående kontroller.
hvis (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Konverter objekter til CMYK først", "CMYK-konvertering kreves"); // avslutte hoved hvis ellers alert ("Ingen av dokumentene er tilgjengelige eller dokumentet er tomt");
Vi kontrollerer om minst ett dokument med minst én objekt eksisterer, slik at vi kan jobbe med det. Deretter sjekker vi om dokumentfargemodus er CMYK eller ikke. Dette er et viktig skritt fordi all logikken for fargekonvertering i dette skriptet er basert på CMYK-farger. convertToFlat ()
er hovedfunksjonen som vil inneholde all logikken. Lagre denne filen som test.jsx.
La oss nå begynne med hovedfunksjonen - convertToFlat ()
. Vi kontrollerer om noe er valgt eller ikke, fordi dette skriptet bare vil fungere på de valgte objektene. Følg deretter følgende kodelinjer til "test.jsx."
funksjon convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // fortsett med hovedlogikken annet alert ("Vennligst velg minst ett objekt"); // end convertToGrad
Deretter vil vi starte en løkke inne i "hvis (totalt valgt> 0)
"blokk. Denne sløyfen vil inneholde fargekonverteringlogikken, som gjentas for hvert valgt element. Men like før fargekonverteringslogikken, la oss legge til noen flere valideringer og sjekker i den kretsen.
hvis (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
For hvert valgt element sjekker vi om det er en sammensatt sti eller et gruppepunkt. I så fall skal skriptet ikke utføres lenger og returnere en varselmelding. Videre kontrollerer vi om fyltypen til det valgte elementet er noe annet enn Gradient Fill. d.v.s. Hvis det er en spotfarge, flat CMYK-farge eller et mønster; Skriptet skal returnere et varsel. Disse kontrollene utføres fordi vårt skript bare vil fungere for gradientfylte, ikke-sammensatte baneelementer.
Deretter vil vi endre fargekonverteringsblokken.
På dette stadiet må vi trekke ut individuelle C-, M-, Y- og K-verdier for fargene som ligger i forskjellige gradientstopp. For det vil vi opprette noen variabler som vil holde individuelle CMYK-verdier. Så legg til følgende variabeldeklarasjoner like innenfor Fargekonvertering blokk:
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 gulTotal = 0; var blackTotal = 0; var gråTotal = 0;
Vi vil se rollen til hver variabel en-for-en:
current
vil lagre fyllfarge (gradient) for det valgte objektet.numOfStops
inneholder det totale antall gradientstopp som er tilgjengelig i det valgte objektet. Dette vil bli brukt til å finne gjennomsnittet av fargeverdier i senere stadier.fargeboks
er en matrise som vil holde fyllefargeverdien for alle gradientstoppene. dvs. hvis numOfStops
er fire.fargeboks
array vil inneholde fire farger.cyanBox
er en matrise som holder cyanverdier for hver farge på forskjellige gradientstopp.magentaBox
, yellowbox
ogsvart boks
Hold respektive fargeverdier for hver farge på forskjellige gradientstopp.grayBox
er en matrise som har grå verdier for fargen på en gradientstopp. Dette er viktig fordi den grå fargen er en annen spesifikasjon enn CMYK-fargespesifikasjon. Hvis et objekt inneholder en grå gradient, håndterer vi situasjonen separat ved å benytte seg av denne variabelen.cyanTotal
, magentaTotal
, yellowTotal
, blackTotal
og grayTotal
. Disse variablene inneholder summasjonen av henholdsvis cyan, magenta, gul, svart eller grå.Vi har utført valideringer og sjekker. Vi har også opprettet nødvendige beholdere for å holde fargeverdier. Deretter løper vi en sløyfe som leser hver gradientstopp en-for-en. For det, opprett en løkke, som vist nedenfor:
for (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
returnerer fargen til et bestemt gradientstopp for hver iterasjon av k.
For hver gradientstopp kontrollerer vi om tilgjengelig farge er en GrayColor
spesifikasjon eller a CMYKColor
spesifikasjonen. Avhengig av det, vil vi implementere vår logikk.
Inne i "hvis blokk
"for GrayColor
spesifikasjon, legg til følgende linjer med kode:
grayBox [k] = Math.round (colorBox [k] .gray); grayTotal = grayTotal + grayBox [k];
derav, grayBox [k]
vil holde alle de grå verdiene for hver farge ved de respektive gradientstoppene.
neste, grayTotal
vil være summasjonen av disse gråfargeverdiene, som vil bli brukt senere.
Inne i "ellers blokkere
"for CMYKColor
spesifikasjon, legg til følgende linjer med kode:
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]; gulTotal = gulTotal + gulBox [k]; blackTotal = blackTotal + blackBox [k];
For å forstå hva som blir utført her, tar vi et eksempel på Cyan farge. cyanBox [k]
lagrer cyanverdiene for alle fargene som ligger i forskjellige gradientstopp. neste, cyanTotal
er summen av alle disse cyanverdiene som er lagret i cyanBox [k]
.
En lignende operasjon utføres for magenta, gul og svart også. Når summeringen er ferdig, kan vi komme ut av løkken og fortsette fremover for gjennomsnittet.
Vi har samlet den enkelte summeringen av grayColor
og CMYKColor
for hele graden stopper. Nå må vi gjennomsnittlig dem. For det, lukk "for k loop
"og skriv inn følgende kodelinjer like etter avslutningsarmbåndet til"for k loop
", som vist under:
// end for 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);
I de ovennevnte kodelinjene deler vi individuelle summeringer av C, M, Y og K ved numOfStops
. dvs. hvis det var fem gradientstopp, vil vi dele summasjonen av individuelle C-, M-, Y- og K-verdier med fem. Deretter returnerer et gjennomsnitt på fem verdier. Disse gjennomsnittlige verdiene lagres som newCyan
, newMagenta
, newYellow
og newBlack
henholdsvis.
Legg merke til det vanskelige tilfellet av grå og svart her. Summen av K er ikke bare blackTotal
. Snarere er det en sum av grayTotal
og blackTotal
.
Hvorfor har vi gjort det? Det er tilfeller der en gradientfylling kan inneholde begge GrayColor-stopp og CMYK stopper. I så fall legges de grå fargeverdiene til K-verdien av CMYK-fargene. Grå kan ikke legges til cyan, magenta eller gul. Det vil bare falle i kategorien K.
Nå har vi alle de nye gjennomsnittlige verdiene for C, M, Y og K i hånden. I neste trinn vil vi implementere disse verdiene som en ny CMYK-farge på det nåværende objektet.
For å implementere den nye fargen, vil vi opprette en ny CMYKColor
objekt og endre sine C, M, Y og K-verdier til de som vi nettopp har beregnet i trinn 7. For å gjøre det, legg til følgende linjer med kode:
var newColor = ny CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;
Vi har opprettet en newColor
objekt og tilordne verdiene for newCyan
, newMagenta
, newYellow
og newBlack
som henholdsvis C, M, Y og K.
Deretter har vi tildelt newColor
som en Fyll farge
til det nåværende objektet. Derfor vil vår siste kode nå se ut som den nedenfor:
hvis (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Konverter objekter til CMYK først", "CMYK-konvertering kreves"); // avslutte hoved hvis ellers alert ("Ingen av dokumentene er tilgjengelige eller dokumentet er tomt"); funksjon convertToFlat () var items = selection; var totalSelected = items.length; hvis (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
Lagre dette skriptet som "test.jsx" og åpne Adobe Illustrator. Deretter lager du noen objekter med fargerike gradientfyll. Nå for å teste dette skriptet, velg noen objekter og gå til File> Scripts> Other Script (Command + F12) og finn dette skriptet.
Etter vellykket utførelse av manuset, bør du se en smelte av gradienter; noe som ligner på dette:
I denne opplæringen har vi sett hvordan man smelter en gradient til en flat fargefylling ved hjelp av skript. Dette skriptet kan bli funnet nyttig i tilfeller der du må finne gjennomsnittet av to eller flere farger. Men frukten av denne opplæringen er å forstå grunnleggende om skripting og deres implementering med Illustrator.
Det er et bredt spekter av vektorkreativitet og innovasjon gjennom skripting. Håper denne todelte opplæringsserien vil inspirere lesere og forfattere til å frembringe essensen av skripting. Takk for din verdifulle tid i å lese denne opplæringen.
Abonner på Vectortuts + RSS-feed for å holde deg oppdatert med de nyeste vektoropplæringene og artiklene.