Scripting Illustrator Part 2 - Comment fondre un dégradé dans une couleur de traitement à plat

Dans la première partie de cette série de didacticiels en deux parties, nous avons appris à coder un script qui convertit une couleur de traitement uniforme en son dégradé. Dans ce didacticiel, nous allons apprendre à coder un script qui convertit un remplissage dégradé en une couleur de traitement uniforme. Nous allons fondre la couleur de dégradé disponible en une couleur de traitement à plat, qui sera un mélange de toutes les couleurs disponibles dans ce dégradé..

Toute cette tâche sera effectuée via un script JavaScript pour Illustrator. Le didacticiel suppose que vous maîtrisez les bases du script. Pour ceux qui ont directement abordé ce tutoriel, nous avons un peu de savoir-faire sur les javascripts d'Illustrator dans la première partie de cette série. Alors sans plus tarder, commençons!

Vecteur plus

Vous voulez accéder à l'intégralité des fichiers Vector Source et aux copies téléchargeables de chaque didacticiel, y compris celui-ci? Rejoignez Vector Plus pour seulement 9 $ par mois.

Détails du tutoriel

  • Programme: Adobe Illustrator et ExtendedScript Toolkit
  • Version: CS3
  • Difficulté: Intermédiaire
  • Temps d'exécution estimé: 3 à 4 heures

But du script

Nous voulons que ce script exécute une tâche très simple. Dans Adobe Illustrator, lorsqu'un utilisateur sélectionne des objets remplis d'une couleur de dégradé CMJN et exécute ce script. les objets doivent être convertis en remplissage CMJN plat. Ce remplissage à plat sera le mélange de toutes les couleurs disponibles dans l'ancien dégradé. Voir l'image ci-dessous pour clarification.

Par conséquent, le but de notre script est de convertir un remplissage dégradé CMJN en un remplissage CMJN uniforme..

Logique et algorithme

La logique pour fondre les couleurs d'un dégradé en une seule couleur est simple et directe. Nous allons choisir toutes les couleurs du dégradé, trouver leur moyenne et l'assigner à l'objet en tant que nouvelle couleur. Nous pouvons comprendre cela en cinq étapes, comme indiqué ci-dessous:

  • Étape 1: Choisissez la couleur de l'objet actuel. CurrentColor = couleur de l'objet actuellement sélectionné.
  • Étape 2: Compter le nombre d'arrêts de dégradés dans la couleur actuelle.
  • Étape 3: À chaque arrêt de dégradé, sélectionnez la couleur associée et ses valeurs CMJN.
  • Étape 4: Calculez la valeur CMJN moyenne pour toutes les couleurs disponibles à différents arrêts.
  • Étape 5:
    Attribuer cette valeur CMJN moyenne en tant que nouvelle couleur à l'objet.

L'algorithme ci-dessus peut être facilement compris à partir de la représentation illustrée ci-dessous.

Nous avons vu un bref aperçu de la logique. Commençons avec le codage.

Étape 1 - En commençant par la structure de code

Ouvrez ExtendedScript Toolkit et créez un nouveau fichier Javascript (Commande + N). Ensuite, sélectionnez Adobe Illustrator pour l'application cible..

Dans la zone d'édition de code, ajoutez la structure de code suivante pour certaines validations et vérifications préalables..

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Convertissez les objets en CMJN en premier", "Conversion CMJN requise");  // end main if if alert ("Aucun document n'est disponible ou le document est vide"); 

Nous vérifions s'il existe au moins un document avec au moins un objet afin de pouvoir le travailler. Ensuite, nous vérifions si le mode de couleur du document est CMJN ou non. C’est une étape essentielle car toute la logique de conversion des couleurs de ce script est basée sur les couleurs CMJN.. convertToFlat () est la fonction principale qui contiendra toute la logique. Ensuite, enregistrez ce fichier sous test.jsx.

Étape 2

Commençons maintenant par la fonction principale - convertToFlat (). Nous vérifierons si un élément est sélectionné ou non, car ce script ne fonctionnera que sur les objets sélectionnés. Par conséquent, ajoutez les lignes de code suivantes à "test.jsx".

 fonction convertToFlat () var items = selection; var totalSelected = items.length; if (totalSelected> 0) // continue avec la logique principale else alert ("Veuillez sélectionner au moins un objet");  // fin de convertToGrad

Étape 3

Ensuite, nous allons commencer une boucle dans le "si (totalSélectionné> 0)"block. Cette boucle contiendra la logique de conversion des couleurs, qui est répétée pour chaque élément sélectionné. Mais juste avant la logique de conversion des couleurs, ajoutons quelques validations et vérifications supplémentaires dans cette boucle..

 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

Pour chaque élément sélectionné, nous vérifions s’il s’agit d’un chemin composé ou d’un élément de groupe. Si c'est le cas, le script ne doit plus être exécuté et renvoyer un message d'alerte. De plus, nous vérifions si le type de remplissage de l'élément sélectionné est autre chose que le remplissage en dégradé. c'est-à-dire s'il s'agit d'une couleur d'accompagnement, d'une couleur à plat CMJN ou d'un motif; le script doit renvoyer une alerte. Ces vérifications sont effectuées car notre script ne fonctionnera que pour les éléments de chemin non composés remplis en dégradé..
Ensuite, nous allons modifier le bloc de conversion de couleur.

Étape 4

A ce stade, nous devons extraire les valeurs individuelles C, M, Y et K pour les couleurs résidant à différents niveaux de dégradé. Pour cela, nous allons créer des variables qui contiendront des valeurs CMJN individuelles. Donc, ajoutez les déclarations de variable suivantes juste à l'intérieur du bloc de conversion de couleur:

 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;

Nous verrons le rôle de chaque variable une par une:

  • couleur courante stockera la couleur de remplissage (dégradé) de l'objet sélectionné.
  • numOfStops contient le nombre total d'arrêts de dégradé disponibles dans l'objet actuellement sélectionné. Ceci sera utilisé pour trouver la moyenne des valeurs de couleur dans les étapes ultérieures.
  • boîte de couleur est un tableau qui contiendra la valeur de couleur de remplissage pour tous les arrêts de dégradé. c'est-à-dire si numOfStops est quatre.
  • boîte de couleur tableau contiendra quatre couleurs.
  • cyanBox est un tableau qui contient des valeurs cyan pour chaque couleur sur différents pentes de dégradé.
  • De même, magentaBox, YellowBox et
    boîte noire maintenir leurs valeurs de couleur respectives pour chaque couleur sur différents pentes de dégradé.
  • grayBox est un tableau qui contient les valeurs de gris pour la couleur sur tout arrêt de dégradé. Cela est essentiel car la couleur grise est une spécification différente de celle de la couleur CMJN. Si un objet contient un dégradé de gris, nous traiterons la situation séparément en utilisant cette variable..
  • Enfin, nous avons cyanTotal, magentaTotal, jauneTotal, blackTotal et greyTotal. Ces variables contiennent la somme de toutes les valeurs cyan, magenta, jaune, noir et gris respectivement.

Étape 5

Nous avons effectué les validations et les contrôles. Nous avons également créé les conteneurs nécessaires pour conserver les valeurs de couleur. Ensuite, nous allons exécuter une boucle qui lit chaque arrêt de dégradé un par un. Pour cela, créez une boucle, comme indiqué ci-dessous:

 pour (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 renvoie la couleur d'un arrêt de gradient particulier pour chaque itération de k.

Pour chaque arrêt de dégradé, nous vérifions si la couleur disponible est un Couleur grise spécification ou un CMJNCouleur spécification. En fonction de cela, nous allons mettre en œuvre notre logique.

Étape 6 - Sommation des valeurs de GrayColor

À l'intérieur de "si bloqué" pour Couleur grise spécification, ajoutez les lignes de code suivantes:

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

Par conséquent, grayBox [k] tiendra toutes les valeurs de gris pour chaque couleur à leurs arrêts de dégradé respectifs.
Suivant, greyTotal sera la somme de ces valeurs de couleur grise, qui seront utilisées plus tard.

Étape 7 - Récapitulation des valeurs de couleur CMJN

À l'intérieur de "bloc d'autre" pour CMJNCouleur spécification, ajoutez les lignes de code suivantes:

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

Pour comprendre ce qui se passe ici, nous allons prendre un exemple de couleur cyan. cyanBox [k] stocke les valeurs cyan pour toutes les couleurs résidant à différents niveaux de dégradé. Suivant, cyanTotal est la somme de toutes ces valeurs cyan stockées dans cyanBox [k].

Une opération similaire est également effectuée pour le magenta, le jaune et le noir. Une fois la sommation terminée, nous pouvons sortir de la boucle et procéder à la moyenne.

Étape 8 - Calcul de la moyenne des valeurs de couleur

Nous avons rassemblé le résumé individuel de couleur grise et CMJNCouleur pour tout le dégradé s'arrête. Nous devons maintenant les pondérer. Pour cela, fermez le "pour la boucle k"et entrez les lignes de code suivantes juste après le bracelet de fermeture de"pour la boucle k", comme indiqué ci-dessous:

  // fin de la boucle 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);

Dans les lignes de code ci-dessus, nous divisons les sommations individuelles de C, M, Y et K par numOfStops. c'est-à-dire s'il y avait cinq arrêts de gradient, nous diviserons la somme des valeurs individuelles C, M, Y et K avec cinq. De ce fait, renvoyant une moyenne de cinq valeurs. Ces valeurs moyennes sont stockées sous la forme nouveauCyan, newMagenta, nouveauJaune et nouveauBlack respectivement.

Notez le cas délicat de gris et noir ici. La somme de K n'est pas seulement blackTotal. Plutôt, c'est une somme de greyTotal et blackTotal.

Pourquoi avons-nous fait cela? Dans certains cas, un remplissage en dégradé peut contenir à la fois des couleurs GrayColor et des couleurs CMYK. Dans ce cas, les valeurs de couleur grises sont ajoutées à la valeur K de la couleur CMJN. Le gris ne peut pas être ajouté au cyan, au magenta ou au jaune. Il tombera dans la catégorie de K seulement.

Nous avons maintenant toutes les nouvelles valeurs moyennes pour C, M, Y et K en main. Dans l'étape suivante, nous implémenterons ces valeurs en tant que nouvelle couleur CMJN sur l'objet actuel..

Étape 9 - Mise en œuvre de la nouvelle couleur

Pour mettre en œuvre la nouvelle couleur, nous allons créer un nouveau CMJNCouleur object et modifie ses valeurs C, M, Y et K par rapport à celles que nous venons de calculer à l'étape 7. Pour ce faire, ajoutez les lignes de code suivantes:

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

Nous avons créé un nouvelle couleur objet et attribué les valeurs de nouveauCyan, newMagenta, nouveauJaune et nouveauBlack comme ses valeurs C, M, Y et K respectivement.

Ensuite, nous avons assigné le nouvelle couleur comme un la couleur de remplissage à l'objet actuel. Par conséquent, notre code final ressemblera maintenant à celui ci-dessous:

 if (app.documents.length> 0 && app.activeDocument.pathItems.length> 0) if (app.activeDocument.documentColorSpace == DocumentColorSpace.CMYK) convertToFlat ();  else alert ("Convertissez les objets en CMJN en premier", "Conversion CMJN requise");  // end main if if alert ("Aucun document n'est disponible ou le document est vide");  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

Étape 10 - Exécution du script

Enregistrez ce script sous "test.jsx" et ouvrez Adobe Illustrator. Créez ensuite des objets avec des dégradés colorés. Maintenant, pour tester ce script, sélectionnez quelques objets et allez dans Fichier> Scripts> Autre script (Commande + F12) et localisez ce script.

Après une exécution réussie du script, vous devriez voir une fusion des dégradés. quelque chose de semblable à ceci:

Conclusion et portée

Dans ce didacticiel, nous avons vu comment transformer un dégradé en un remplissage de couleur uniforme à l’aide de scripts. Ce script peut s'avérer utile dans les cas où vous devez trouver la moyenne de deux couleurs ou plus. Mais le fruit de ce tutoriel est de comprendre les bases du script et sa mise en oeuvre avec Illustrator.

La création de vecteurs et l'innovation au moyen de scripts sont très variées. J'espère que cette série de didacticiels en deux parties inspirera les lecteurs et les auteurs à mettre en avant l'essence du script. Merci pour votre temps précieux en lisant ce tutoriel.

Abonnez-vous au fil RSS Vectortuts + pour rester au courant des derniers tutoriels et articles sur les vecteurs.