I del 1 i den här handledningsserien i två delar lärde vi oss hur man kodar ett manus som omvandlar en platt processfärg till dess matchande gradient. I den här handledningen lär vi oss att koda ett skript som omvandlar en gradientfyllning till en platt processfärg. Vi kommer att smälta den tillgängliga gradientfärgen till en platt processfärg, som kommer att bli en blandning av alla tillgängliga färger i den gradienten.
Hela uppgiften kommer att utföras via JavaScript-skript för Illustrator. Handledningen förutsätter att du är bekant med grunderna i scripting. För dem som har landat direkt på denna handledning har vi lite kunskap om Illustrators Javascripts i Del 1 i denna serie. Så utan ytterligare förseningar, låt oss börja!
Vill du ha tillgång till hela Vector Source-filerna och nedladdningsbara kopior av varje handledning, inklusive den här? Bli med Plus Plus för bara 9 $ per månad.
Vi vill att detta skript ska utföra en mycket enkel uppgift. I Adobe Illustrator, när en användare väljer vissa objekt fyllda med en CMYK Gradient Color, och exekverar detta Script; Föremålen ska omvandlas till en platt CMYK-fyllning. Denna platta fyllning kommer att vara blandningen av alla färger som finns i den tidigare lutningen. Se bilden nedan för förtydligande.
Därför är målet med vårt skript att konvertera en Gradient CMYK-fill i en platt CMYK-fyllning.
Logiken för att smälta färgerna i en gradient i en enda färg är enkel och okomplicerad. Vi väljer alla färgerna från gradienten, hittar deras medelvärde och tilldelar objektet som en ny färg. Vi kan förstå detta i fem steg, som visas nedan:
Ovanstående algoritm kan lätt förstås från den nedan angivna bildrepresentationen.
Vi har sett en kort översikt över logiken. Låt oss börja med kodningen.
Öppna ExtendedScript Toolkit och skapa en ny Javascript-fil (Command + N). Välj sedan Adobe Illustrator för målprogrammet.
I kodredigeringsområdet lägger du till följande kodstruktur för vissa valideringar och nödvändiga kontroller.
om (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) om (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Konvertera objekten till CMYK först", "CMYK-konvertering krävs"); // avsluta huvud om annars alert ("Ingendera dokumentet är tillgängligt eller dokumentet är tomt");
Vi kontrollerar om minst ett dokument med minst ett objekt finns så att vi kan arbeta med det. Därefter kontrollerar vi om dokumentfärgsläget är CMYK eller inte. Detta är ett viktigt steg eftersom all logiken för färgomvandling i det här skriptet är baserad på CMYK-färger. convertToFlat ()
är huvudfunktionen som kommer att innehålla all logiken. Spara sedan den här filen som test.jsx.
Låt oss nu börja med huvudfunktionen - convertToFlat ()
. Vi kontrollerar om något objekt är valt eller inte, eftersom det här skriptet bara fungerar på de valda objekten. Lägg därför till följande rader av kod till "test.jsx."
funktion convertToFlat () var items = selection; var totaltVäljat = items.length; om (totaltVäljat> 0) // fortsätt med huvudlogiken annars alert ("Vänligen välj minst ett objekt"); // end convertToGrad
Därefter börjar vi en loop i "om (totaltValda> 0)
"blocket. Denna slinga kommer att innehålla färgomvandlingslogiken, som upprepas för varje valda objekt. Men precis före färgkonverteringslogiken, låt oss lägga till några fler valideringar och kontroller i den öglan.
om (totaltVäljat> 0) för (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
För varje markerat objekt kontrollerar vi om det är en sammansatt sökväg eller ett gruppobjekt. Om så är fallet ska skriptet inte utföras längre och returnera ett varningsmeddelande. Vidare kontrollerar vi om fyllningstypen för det valda objektet är något annat än Gradient Fill. d.v.s. Om det är en fläckfärg, platt CMYK-färg eller ett mönster; Skriptet ska returnera en varning. Dessa kontroller utförs eftersom vårt skript bara fungerar för gradientfyllda icke-sammansatta sökfält.
Därefter kommer vi att ändra färgomvandlingsblocket.
I detta skede behöver vi extrahera individuella C, M, Y och K-värden för färgerna som ligger vid olika gradientstopp. För det kommer vi att skapa några variabler som håller individuella CMYK-värden. Så lägg till följande variabla deklarationer precis innanför färgomvandlingsblocket:
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 kommer att se rollen för varje variabel en-för-en:
currentColor
lagrar fyllnadsfärgen (gradient) för det aktuella valda objektet.numOfStops
innehåller det totala antalet gradientstopp som är tillgängliga i det aktuella valda objektet. Detta kommer att användas för att hitta medelvärdet av färgvärden i senare steg.färglåda
är en array som håller fyllnadsfärgen för alla gradientstopp. d.v.s. om numOfStops
är fyra.färglåda
array kommer att innehålla fyra färger.cyanBox
är en grupp som håller cyanvärden för varje färg på olika gradientstopp.magentaBox
, yellowBox
ochsvart låda
Håll respektive färgvärden för varje färg på olika gradientstopp.grayBox
är en array som håller grå värden för färgen på något gradientstopp. Detta är viktigt eftersom den grå färgen är en annan specifikation än CMYK-färgspecifikation. Om ett objekt innehåller en grå gradient, hanterar vi situationen separat genom att använda denna variabel.cyanTotal
, magentaTotal
, yellowTotal
, blackTotal
och grayTotal
. Dessa variabler innehåller summan av alla cyan, magenta, gul, svart eller grå värden.Vi har utfört valideringarna och kontrollerna. Vi har också skapat nödvändiga behållare för att hålla färgvärden. Därefter kommer vi att köra en slinga som läser varje gradientstopp en-för-en. För det här, skapa en slinga, som visas nedan:
för (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
returnerar färgen på ett visst gradientstopp för varje iteration av k.
För varje gradientstopp kontrollerar vi om den tillgängliga färgen är en Grå färg
specifikation eller a CMYKColor
Specifikation. Beroende på det kommer vi att genomföra vår logik.
Inuti "om block
" för Grå färg
specifikation, lägg till följande rader av kod:
grayBox [k] = Math.round (colorBox [k] .gray); gråTotal = gråTotal + gråBox [k];
Därav, grayBox [k]
kommer att hålla alla gråvärden för varje färg vid respektive gradientstopp.
Nästa, grayTotal
kommer att vara summan av dessa grå färgvärden, som kommer att användas senare.
Inuti "annars blockera
" för CMYKColor
specifikation, lägg till följande rader av kod:
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];
För att förstå vad som utförs här kommer vi att ta ett exempel på cyanfärg. cyanBox [k]
lagrar cyanvärdena för alla färger som ligger vid olika gradientstopp. Nästa, cyanTotal
är summan av alla dessa cyanvärden som lagras i cyanBox [k]
.
En liknande operation utförs för magenta, gul och svart också. När summeringen är klar kan vi komma ur slingan och fortsätta i genomsnitt.
Vi har samlat den enskilda summeringen av grå färg
och CMYKColor
för all gradienten stannar. Nu behöver vi genomsnittsa dem. För det, stäng "för k loop
"och ange följande rader av kod strax efter avslutningsarmbandet för"för k loop
", enligt nedanstående:
// slut för k loop var finalBlack = blackTotal + gråTotal; 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 ovanstående rader av kod delar vi enskilda summeringar av C, M, Y och K av numOfStops
. d.v.s. Om det fanns fem gradientstopp, delas summeringen av individuella C-, M-, Y- och K-värden med fem. Därmed returnerar i genomsnitt fem värden. Dessa medelvärden lagras som newCyan
, newMagenta
, newYellow
och newBlack
respektive.
Observera det svåra fallet med grå och svart här. Summan av K är inte bara blackTotal
. Det är snarare en summa av grayTotal
och blackTotal
.
Varför har vi gjort det?? Det finns fall där en gradientfyllning kan innehålla båda GrayColor-stopp och CMYK stannar. I så fall läggs de grå färgvärdena till K-värdet för CMYK-färgen. Grå kan inte läggas till cyan, magenta eller gul. Det kommer bara att falla i kategorin K.
Nu har vi alla nya medelvärden för C, M, Y och K i handen. I nästa steg implementerar vi dessa värden som en ny CMYK-färg på det aktuella objektet.
För att implementera den nya färgen kommer vi att skapa en ny CMYKColor
objekt och ändra dess C, M, Y och K-värden till de som vi just beräknat i steg 7. För att göra det, lägg till följande rader av kod:
var newColor = ny CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newYellow; newColor.black = newBlack; currentObject.fillColor = newColor;
Vi har skapat en newColor
objekt och tilldelade värdena för newCyan
, newMagenta
, newYellow
och newBlack
som dess C-, M-, Y- och K-värden.
Därefter har vi tilldelat newColor
som en fyllnadsfärg
till det aktuella objektet. Därför ser vår sista kod nu ut som nedan:
om (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) om (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Konvertera objekten till CMYK först", "CMYK-konvertering krävs"); // avsluta huvud om annars alert ("Ingendera dokumentet är tillgängligt eller dokumentet är tomt"); funktion convertToFlat () var items = selection; var totaltVäljat = items.length; om (totaltVäljat> 0) för (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
Spara det här skriptet som "test.jsx" och öppna Adobe Illustrator. Skapa sedan några objekt med färgglada gradientfyllningar. För att testa detta skript, välj några objekt och gå till Arkiv> Skript> Annan skript (Command + F12) och leta reda på det här skriptet.
Efter ett framgångsrikt utförande av manuset ska du se en smältning av gradienterna; något som liknar detta:
I denna handledning har vi sett hur man smälter en lutning till en platt färgfyllning med hjälp av skript. Det här skriptet kan vara användbart i fall där du behöver hitta medelvärdet av två eller flera färger. Men frukten av denna handledning är att förstå grunderna för scripting och deras genomförande med Illustrator.
Det finns ett brett spektrum av vektor kreativitet och innovation genom skripting. Hoppas att den här tvådelade handledningsserien kommer att inspirera läsare och författare att framföra essensen av skript. Tack för din värdefulla tid när du läser denna handledning.
Prenumerera på Vectortuts + RSS-flödet för att hålla dig uppdaterad med de senaste vektorhandledningarna och artiklarna.