In deel 1 van deze tweedelige instructiereeks hebben we geleerd hoe je een script codeert dat een platte proceskleur omzet in het bijbehorende verloop. In deze zelfstudie leren we een script coderen dat een verloopvulling omzet in een platte proceskleur. We smelten de beschikbare kleurverloop in een platte proceskleur, die een mengsel is van alle kleuren die beschikbaar zijn in dat verloop.
Deze hele taak wordt uitgevoerd via JavaScript-script voor Illustrator. De tutorial gaat ervan uit dat je bekend bent met de basisprincipes van scripting. Voor diegenen die direct zijn geland op deze tutorial, hebben we een klein beetje knowhow over Javascripts van Illustrator in deel 1 van deze serie. Dus zonder verdere vertragingen, laten we aan de slag gaan!
Wil je toegang tot de volledige Vector Source-bestanden en downloadbare exemplaren van elke tutorial, inclusief deze? Word lid van Vector Plus voor slechts 9 $ per maand.
We willen dat dit script een heel eenvoudige taak uitvoert. In Adobe Illustrator, wanneer een gebruiker enkele objecten selecteert die zijn gevuld met een CMYK Gradient Color en dit script uitvoert; de objecten worden omgezet in een platte CMYK-vulling. Deze vlakke vulling is het mengsel van alle kleuren die beschikbaar zijn in het vorige verloop. Zie de afbeelding hieronder voor verduidelijking.
Daarom is het doel van ons script om een CMYK-verloop met verloop uit te zetten in een platte CMYK-vulling.
De logica voor het smelten van de kleuren van een verloop in een enkele kleur is eenvoudig en duidelijk. We kiezen alle kleuren uit het verloop, vinden hun gemiddelde en wijzen het toe aan het object als een nieuwe kleur. We begrijpen dit in vijf stappen, zoals hieronder getoond:
Het bovenstaande algoritme kan gemakkelijk worden begrepen aan de hand van de onderstaande afbeeldingen.
We hebben een kort overzicht van de logica gezien. Laten we beginnen met de codering.
Open ExtendedScript Toolkit en maak een nieuw Javascript-bestand aan (Command + N). Selecteer vervolgens Adobe Illustrator voor de doeltoepassing.
Voeg in het codebewerkingsgebied de volgende codestructuur toe voor bepaalde validaties en controles vooraf.
if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Converteer de objecten naar CMYK eerst", "CMYK-conversie vereist"); // end main if else alert ("Er is geen document beschikbaar of het document is leeg");
We controleren of er ten minste één document met ten minste één object bestaat, zodat we eraan kunnen werken. Vervolgens controleren we of de documentkleurenmodus CMYK is of niet. Dit is een essentiële stap omdat alle logica voor kleurconversie in dit script is gebaseerd op CMYK-kleuren. convertToFlat ()
is de hoofdfunctie die alle logica zal bevatten. Bewaar dit bestand vervolgens als test.jsx.
Laten we beginnen met de hoofdfunctie - convertToFlat ()
. We zullen controleren of een item is geselecteerd of niet, omdat dit script alleen op de geselecteerde objecten zal werken. Voeg daarom de volgende coderegels toe aan "test.jsx."
function convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // ga verder met de hoofdlogica else alert ("Selecteer ten minste één object"); // end convertToGrad
Vervolgens beginnen we een lus in de "if (totalSelected> 0)
"block. Deze loop bevat de logica voor kleurconversie, die wordt herhaald voor elk geselecteerd item. Maar net voor de logica voor kleurconversie voegen we nog een aantal validaties en controles toe binnen die lus.
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
Voor elk geselecteerd item controleren we of het een samengestelde pad of een groepsitem is. Als dit het geval is, wordt het script niet meer uitgevoerd en wordt een waarschuwingsbericht geretourneerd. Verder controleren we of het opvultype van het geselecteerde item iets anders is dan Gradient Fill. d.w.z. Als het een steunkleur, platte CMYK-kleur of een patroon is; het script geeft een waarschuwing terug. Deze controles worden uitgevoerd omdat ons script alleen werkt voor met verloop gevulde niet-samengestelde paditems.
Vervolgens zullen we het kleurconversieblok wijzigen.
In dit stadium moeten we afzonderlijke C-, M-, Y- en K-waarden extraheren voor de kleuren die zich op verschillende verloopstops bevinden. Hiervoor zullen we enkele variabelen maken die individuele CMYK-waarden bevatten. Voeg dus de volgende variabele declaraties toe net binnen het blok Kleurconversie:
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;
We zullen de rol van elke variabele één voor één bekijken:
currentcolor
zal de opvulkleur (gradient) van het momenteel geselecteerde object opslaan.numOfStops
bevat het totale aantal verloopstops dat beschikbaar is in het momenteel geselecteerde object. Dit wordt gebruikt om het gemiddelde van kleurwaarden in latere stadia te vinden.Kleurdoos
is een array die de opvulkleurwaarde voor alle verloopaanslagen houdt. dat wil zeggen als numOfStops
is vier.Kleurdoos
array bevat vier kleuren.cyanBox
is een array die cyaanwaarden voor elke kleur op verschillende verloopstops bevat.magentaBox
, yellowbox
enzwarte doos
Houd hun respectievelijke kleurwaarden voor elke kleur op verschillende verloopstops.grayBox
is een array met grijswaarden voor de kleur bij een verloopstop. Dit is essentieel omdat de grijze kleur een andere specificatie heeft dan de CMYK-kleurspecificatie. Als een object een grijs verloop bevat, zullen we de situatie afzonderlijk behandelen door gebruik te maken van deze variabele.cyanTotal
, magentaTotal
, yellowTotal
, blackTotal
en grayTotal
. Deze variabelen bevatten de som van alle waarden voor cyaan, magenta, geel, zwart of grijs.We hebben de validaties en controles uitgevoerd. We hebben ook de nodige containers gemaakt om kleurwaarden vast te houden. Vervolgens zullen we een lus uitvoeren die elke verloopstop één voor één leest. Maak daarvoor een lus, zoals hieronder getoond:
voor (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] .Kleur
retourneert de kleur van een bepaalde gradiëntstop voor elke iteratie van k.
Voor elke verloopstop controleren we of de beschikbare kleur een is Grijze kleur
specificatie of een CMYKColor
specificatie. Afhankelijk van dat, zullen we onze logica implementeren.
Binnen in de "als blok
" voor Grijze kleur
specificatie, voeg de volgende regels toe:
grayBox [k] = Math.round (colorBox [k] .gray); grayTotal = grayTotal + grayBox [k];
Vandaar, grayBox [k]
bevat alle grijswaarden voor elke kleur op de respectieve verloopstops.
volgende, grayTotal
is de som van deze grijswaarden, die later worden gebruikt.
Binnen in de "anders blok
" voor CMYKColor
specificatie, voeg de volgende regels toe:
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 + cyaanbox [k]; magentaTotal = magentaTotal + magentaBox [k]; yellowTotal = yellowTotal + yellowBox [k]; blackTotal = blackTotal + blackBox [k];
Om te begrijpen wat hier wordt uitgevoerd, nemen we een voorbeeld van Cyaan-kleur. cyanBox [k]
is het opslaan van de cyaanwaarden voor alle kleuren die zich op verschillende gradiëntstops bevinden. volgende, cyanTotal
is de optelling van al deze cyaanwaarden die zijn opgeslagen in cyanBox [k]
.
Een soortgelijke bewerking wordt ook uitgevoerd voor magenta, geel en zwart. Zodra de sommatie is voltooid, kunnen we uit de hand lopen en doorgaan met het gemiddelde.
We hebben de individuele optelling van verzameld grijze kleur
en CMYKColor
voor alle verloop stopt. Nu moeten we ze gemiddeld maken. Sluit daarvoor de "voor k-lus
en voer de volgende coderegels in net na de sluitingsarmband van "voor k-lus
", zoals hieronder getoond:
// end for k loop var finalBlack = blackTotal + grayTotal; var newCyan = Math.round (cyanTotal / numOfStops); var newMagenta = Math.round (magentaTotal / numOfStops); var newGeel = Math.round (yellowTotal / numOfStops); var newBlack = Math.round (finalBlack / numOfStops);
In de bovenstaande coderegels delen we individuele optellingen van C, M, Y en K door numOfStops
. d.w.z. Als er vijf gradiëntstops waren, zullen we de optelling van individuele C-, M-, Y- en K-waarden verdelen met vijf. Daardoor worden gemiddeld vijf waarden geretourneerd. Deze gemiddelde waarden worden opgeslagen als newCyan
, newMagenta
, newYellow
en nieuwBlack
respectievelijk.
Let op het lastige geval van grijs en zwart hier. De optelling van K is niet alleen blackTotal
. Integendeel, het is een som van grayTotal
en blackTotal
.
Waarom hebben we dat gedaan?? Er zijn gevallen waarin een verloopvulling zowel GrayColor-stops als CMYK-stops kan bevatten. In dat geval worden de grijze kleurwaarden toegevoegd aan de K-waarde van de CMYK-kleur. Grijs kan niet worden toegevoegd aan cyaan, magenta of geel. Het zal alleen in de categorie K vallen.
Nu hebben we alle nieuwe gemiddelde waarden voor C, M, Y en K in de hand. In de volgende stap zullen we deze waarden implementeren als een nieuwe CMYK-kleur op het huidige object.
Om de nieuwe kleur te implementeren, zullen we een nieuwe maken CMYKColor
object en wijzig de C-, M-, Y- en K-waarden ervan die we in stap 7 hebben berekend. Voeg daarvoor de volgende coderegels toe:
var newColor = nieuwe CMYKColor (); newColor.cyan = newCyan; newColor.magenta = newMagenta; newColor.yellow = newGeluid; newColor.black = newBlack; currentObject.fillColor = newColor;
We hebben een gemaakt nieuwe kleur
object en toegewezen de waarden van newCyan
, newMagenta
, newYellow
en nieuwBlack
als zijn C-, M-, Y- en K-waarden.
Vervolgens hebben we de nieuwe kleur
als een opvulkleur
naar het huidige object. Daarom zal onze definitieve code er nu als volgt uitzien:
if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat (); else alert ("Converteer de objecten naar CMYK eerst", "CMYK-conversie vereist"); // end main if else alert ("Er is geen document beschikbaar of het document is leeg"); 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
Sla dit script op als "test.jsx" en open Adobe Illustrator. Maak vervolgens enkele objecten met kleurrijke verloopvullingen. Om dit script te testen, selecteert u enkele objecten en gaat u naar Bestand> Scripts> Ander script (Command + F12) en lokaliseert u dit script.
Nadat het script met succes is uitgevoerd, ziet u een smeltkroes van de verlopen; zoiets als dit:
In deze zelfstudie hebben we gezien hoe een verloop in een effen kleur kan worden gesmolten met behulp van scripts. Dit script kan handig zijn in gevallen waarin u het gemiddelde van twee of meer kleuren moet vinden. Maar de vrucht van deze tutorial is om de basisbeginselen van scripting en de implementatie ervan met Illustrator te begrijpen.
Er is een breed scala aan vector-creativiteit en -innovatie door middel van scripting. Ik hoop dat deze tweedelige tutorialserie lezers en auteurs zal inspireren om de essentie van scripting naar voren te brengen. Bedankt voor je waardevolle tijd bij het lezen van deze tutorial.
Abonneer u op de Vectortuts + RSS-feed om op de hoogte te blijven van de nieuwste vectorhandleidingen en -artikelen.