• indexa.png
  • indexb.png
  • indexc.png
  • indexd.png
  • indexe.png
UrbanBike en parle... Télécharger goldrush.zip (13 Ko) | Voir l’interface du script (FR)
(Vos commentaires sont vivement appréciés ! Consultez le fichier lisezmoi.txt inclus dans le zip.)
[English users] Download goldrush.zip (13 Ko) | Have a look at the program interface (EN)
(All comments around this beta version are welcome ! See the readme.txt file of the package.)

Consommateur affamé de « tutoriels » Photoshop, vous avez testé des dizaines de méthodes pour métalliser une forme ou dorer un lettrage. Untel préconise l’emploi des styles satin et ombre interne judicieusement accouplés et écrétés, un autre recourt à l’effet chrome sur un dégradé nuageux, etc.

Cependant, simuler les riches variations de brillance qui s’expriment sur un objet réfléchissant implique un travail plus poussé. La technique prisée par les gourous s’appuie sur l’utilisation d’un projecteur (Filtre › Rendu › Éclairage) que l’on va braquer sur la couche alpha de l’objet à travailler. Ladite couche va servir de texture de relief à l’éclairage. Pour peu que cette dernière ait subi un léger flou gaussien, le rendu procure d’intéressantes variations de luminosité dont on va « électriser » les contrastes grâce à un réglage Courbes basé sur une transformation sinusoïdale.

Bien ! Quelques explications ne seront pas malvenues...

Le rendu Éclairage

On ne soupçonne pas les trésors que recèle la fonction de rendu Éclairage. Elle pourrait passer pour un générateur amélioré de dégradés, simulant l’illumination dégressive de l’image à partir de diverses sources de rayonnement positionnées par l’utilisateur. En mode « projecteur », le faisceau lumineux est réputé conique et l’on peut moduler une tripotée de paramètres tels que l’intensité à la source, l’angle du cône lumineux, la matière et la brillance des surfaces éclairées (plus exactement : de leur relief).

L’essentiel à retenir, c’est que ce type de rendu suit, autant que faire se peut, la logique d’un éclairage 3D. Ainsi, comme le montre la figure 1 ci-dessous, le fonctionnement du projecteur devient réellement intéressant lorsqu’on lui soumet une « texture », c’est-à-dire en langage Photoshop une couche alpha préalablement mémorisée (par exemple via Sélection › Mémoriser la sélection).

Figure 1 - Rendu éclairage à base de couche alpha (texture)

Le rendu de la figure 1 est appliqué sur un calque totalement blanc. Le disque qui apparaît en relief reflète une couche alpha issue d’une sélection circulaire (un disque noir sur fond blanc dans la palette Couches). Les points noirs de la couche incarnent les sommets du relief, tandis que les points blancs représentent l’altitude zéro.

L’éclairage n’est donc pas un vulgaire dégradé. Non seulement il génère du « volume » selon les niveaux de gris de la couche alpha, mais il calcule aussi certains effets de lumière sur la surface texturée, en particulier dans les zones dénivelées. La sensation de relief peut être amplifiée de deux façons : d’une part en poussant le curseur du filtre Éclairage vers la borne « montagneuse », d’autre part en floutant (les bords de) la couche alpha. Cela densifie le relief et conduit le filtre d’éclairage à intégrer des transitions plus complexes.

Figure 2 - Autre exemple d’éclairage d’une couche en dégradé

Il existe une part d’impondérable dans tout ce bazar, et c’est bien ce qui rend le filtre si fertile dans la production de textures composées de reflets légèrement bruités. On verra par exemple jaillir des scintillements, un peu de grain et même de petites raies d’interférence (v. fig. 2), comme si Photoshop avait tenté de calculer à la manière d’un moteur de rendu 3D le trajet des photons émis par le projecteur.

Voilà l’excellent dispositif sur lequel s’appuiera notre filtre GoldRush.

Fabriquer des reflets grâce aux courbes de niveaux

Le réglage Courbes — opéré en direct (Ctrl M) ou par calque de réglage — est une fonctionnalité peu intuitive à laquelle on préfère habituellement le réglage Niveaux. Cependant, tandis que ce dernier redistribue les tons de l’image selon une fonction condamnée à rester croissante, Courbes offre davantage de possibilités puisqu’on peut y programmer une transformation non monotone — et le cas échéant des points de discontinuité — toutes choses impossibles à faire avec les curseurs de niveaux.

À l’inverse, tout ce qui est réalisable par les Niveaux l’est aussi par les Courbes. Ainsi, les seuils d’écrétage du réglage Niveaux correspondent aux extremums de la courbe équivalente et le gamma se traduit visuellement par l’incurvation (convexe ou concave) de la ligne de correspondance. De solides explications sur la cuisine des niveaux vous sont déballées dans l’article consacré au script DarkRevelator.

Un premier exemple de courbe « non monotone » serait tout bêtement une espèce de parabole qui envoie le gris neutre (128) sur le blanc (255) tout en envoyant le noir et le blanc, symétriquement, sur le noir (0). La meilleure façon de comprendre ce réglage est de le plaquer sur un dégradé linéaire :

Figure 3 - Effet d’un réglage Courbes de niveaux de type parabolique

Ce qui est frappant dans l’illustration ci-dessus, outre l’apparition de la symétrie axiale, c’est l’accélération, au voisinage des tons noirs, du dégradé résultant. Cet écrétage intense des bas niveaux résulte de l’augmentation du facteur de correspondance (la dérivée, en termes mathématiques) entre les valeurs d’entrée et les valeurs de sortie dans cette partie de la courbe. L’angle α que nous avons dessiné en bleu fluo traduit géométriquement cet écart par rapport au coefficient linéaire initial évidemment égal à 1.

Et la conséquence graphique de cette amplification saute aux yeux : le dégradé relativement « mat » de la scène initiale devient beaucoup plus agressif, brillant, métallique.

Imaginez maintenant qu’au lieu d’une parabole nous tracions une courbe sinusoïdale... Avec un virage tonal supplémentaire et une courbure encore plus serrée, nous créons alors une nouvelle bande lumineuse et, cerise sur le gâteau, de brillance accrue :

Figure 4 - Courbes de niveaux de type sinusoïdal

Ce réglage présente un ultime avantage : contrairement à la courbe parabolique, il conserve la conversion blanc–blanc. En d’autres termes, il ne dénature pas les points extrêmes de l’image sous-jacente bien qu’il bouscule sans ménagement les tons intermédiaires. Cet expédient nous servira à fabriquer du « miroitement » sur une surface traitée prélablement par un éclairage en relief.

Composition des effets et teinture dorée

Nous allons à présent combiner le rendu Éclairage et le réglage Courbes. Voici le processus étape par étape :

1) Créez un nouveau document RVB de 400×400 pixels à 300 pixels / pouce.

2) Insérez un texte quelconque (outil Texte). Choisissez une police offrant des courbes riches et des variations d’empattement, le résultat n’en sera que plus saisissant. Positionnez et redimensionnez le texte afin qu’il occupe substantiellement la surface.

3) Faites CTRL Clic sur la vignette du calque Texte afin de sélectionner le lettrage, puis mémorisez la sélection sur une couche Alpha 1 (Sélection › Mémoriser la sélection...).

4) Supprimez le calque Texte (ou mettez-le en veilleuse) et déselectionnez tout (Ctrl D).

5) Dans la palette « Couches », activez Alpha 1 et infligez-lui un flou gaussien très faible (1 ou 2 points), pour densifier le futur relief.

6) Réactivez la multi-couche RVB et revenez au calque d’arrière-plan dans la palette « Calques ». Il est encore immaculé.

7) Appelez Filtres › Rendu › Éclairage et réglez le projecteur par défaut en Intensité 35 ou supérieure, Cône 50. Maintenez le coefficient Ambiance aux alentours de 7 ou 8. Dans la zone Texture, choisissez votre couche Alpha 1. Fixez le relief à 50 ou davantage. Ce faisant, vous avez vu apparaître votre lettrage en relief ou en creux selon l’option « Blanc = haut » que je laisse à votre convenance. Validez !

8) Greffez au rendu obtenu un calque de réglage « Courbes » avec une transformation sinusoïdale. Réglez l’amplitude de la sinusoïde selon l’effet que vous désirez.

Reste alors à teinter l’image et à faire disparaître le fond du texte qui a subi l’éclairage. Il y a cent façons de créer la teinture or : personnellement, j’utilise un style « Incrustation couleur » en mode de fusion « Lumière » et avec la couleur R200–V150–B0.

Ensuite, veuillez récupérer la sélection de la couche Alpha 1 (Sélection › Récupérer la sélection) et dilatez celle-ci de 3 ou 4 pixels afin de conserver une partie de l’estampage provoqué par le rendu Éclairage. Inversez la sélection (Ctrl Maj I) et supprimez le déchet. Si vous travaillez sur un calque distinct de l’arrière plan, vous aurez tout loisir de repositionner l’objet et de lui attribuer un fond plus seyant.

Figure 5 - Transformation du caractère en plomb en caractère en or...

Automatisation des tâches (aperçu)

La technique exposée dans cet article fait affleurer, tout au long du processus, plusieurs options modifiant sensiblement le résultat. La suppression de la « zone déchet », en dernière étape, sera plus ou moins satisfaisante selon le floutage de la couche alpha. Si l’objet a été grassement biseauté par le flou et l’éclairage, il aura pris un certain volume dans les entournures et il est bien aventureux de précalculer son détourage idéal. Selon le positionnement du projecteur, l’intensité de la lumière, la hauteur du relief, mais aussi selon la pente de la courbe de réglage, vous récolterez des dorures plus ou moins épaisses ou ciselées.

Tout cela pour dire que l’automatisation de l’effet GoldRush n’est pas une mince affaire. S’en acquitter par un « script » Photoshop non codé (palette « Scripts ») est plus qu’improbable.

Une fois encore, il nous faut piloter globalement le traitement en Javascript. Le script que je vous ai concocté comporte quelque 600 lignes de code dont je ne vais pas disséquer ici les tenants et aboutissants. Les javascripteurs éclairés pourront toujours se plonger dans les commentaires du fichier GoldRush.js.

Il est cependant intéressant de s’arrêter quelques instants sur une question récurrente en matière de programmation Photoshop : en dehors des manipulations basiques telles que création de calques, gestion de la sélection, traitement des couches, filtres ancestraux, il existe un nombre impressionnant de fonctionnalités que le modèle objet Javascript n’a pas implémentées.

Par exemple, la détection d’existence d’une sélection utilisateur n’est pourvue par aucune méthode ad hoc de l’objet Document, ArtLayer ou Selection. Un test tel que :
if (app.activeDocument.selection != null)... ne fonctionne pas. Tant et si bien que la création d’une fonction du genre hasSelection() relève de la brico-programmation.

Merci en passant à xbytor, une des vedettes du forum Adobe Photoshop Scripting, d’avoir apporté une solution pas trop tordue à ce cas d’école.
function hasSelection(doc)
//--------------------------------------------------------------------
// Indique si le document possede une selection active
// -- Thanks to xbytor for this hack --
{
var mode = app.displayDialogs;
var ret = false;
try
      {
      app.displayDialogs = DialogModes.NO;
      doc.selection.contract(0);
      ret = true;
      }
catch (e)
      {}
finally
      {
      app.displayDialogs = mode;
      }
return ret;
}

On voit ci-dessus qu’une fonction aussi naturelle que hasSelection() nécessite — même sous Photoshop CS2 — de fricoter avec une exception (try...catch) artificiellement induite par le code.

Autre exemple, plus proche de nous : le filtre Rendu › Éclairage n’est pas implémenté dans la couche Javascript. Comment faire pour l’exploiter quand même ? L’achtuce consiste à copier provisoirement dans le dossier %Photoshop%/Modules externes/Adobe Photoshop Only/Automatisation le module ScriptListener.8li.

Le module ScriptListener se trouve dans le dossier %Photoshop%/Guide des scripts/Utilitaires. Une bonne idée est de le copier une fois pour toutes dans le dossier Automatisation et de le suffixer ScriptListener.8li.off lorsque vous ne l’utilisez pas.

Comme son nom l’indique, ScriptListener « écoute » les actions de l’utilisateur dès l’ouverture de Photoshop et jusqu’à sa fermeture ; il convertit alors toutes ces opérations en script. Un fichier C:\ScriptingListenerJS.log est créé qui contient le code JavaScript sous-jacent (sous Mac OS, le fichier est créé sur le bureau). Bien entendu, ne laissez pas le module ScriptListener actif quand vous n’utilisez pas cette fonctionnalité.

Lorsqu’on examine le code résultant d’une action Filtre › Rendu › Éclairage, on est frappé par la densité et l’ésotérisme du code. En fait, il convient de trier les instructions générées par ScriptListener pour en extraire le fragment utile. Les actions d’ouverture de document et de sélection de calque actif s’évacuent aisément. Le code nettoyé donnera quelque chose comme ceci :

var id47 = charIDToTypeID( "LghE" );
    var desc8 = new ActionDescriptor();
    var id48 = charIDToTypeID( "LghS" );
        var list1 = new ActionList();
            var desc9 = new ActionDescriptor();
            var id49 = charIDToTypeID( "Clr " );
                var desc10 = new ActionDescriptor();
                var id50 = charIDToTypeID( "Rd  " );
                desc10.putDouble( id50, 255.000000 );
                var id51 = charIDToTypeID( "Grn " );
                desc10.putDouble( id51, 254.000000 );
                var id52 = charIDToTypeID( "Bl  " );
                desc10.putDouble( id52, 253.000000 );
 
// etc., etc.
 
   desc8.putObject( id79, id83, desc14 );
    var id84 = charIDToTypeID( "BmpC" );
        var ref4 = new ActionReference();
        var id85 = charIDToTypeID( "Chnl" );
        ref4.putName( id85, "Alpha 1" );
    desc8.putReference( id84, ref4 );
    var id86 = charIDToTypeID( "WhHi" );
    desc8.putBoolean( id86, true );
    var id87 = charIDToTypeID( "BmpA" );
    desc8.putInteger( id87, 50 );
    var id88 = charIDToTypeID( "FrmW" );
    desc8.putDouble( id88, 62.037037 );
executeAction( id47, desc8, DialogModes.NO );

Dans cet extrait de code, on voit surgir les paramètres du rendu, tels que les composantes RVB de la couleur du projecteur ou, plus bas, le nom de la couche (Alpha 1) affectée à la texture. C’est tout cela qu’il faut analyser pour créer une fonction flexible permettant de régler l’intensité, le relief ou même la position du projecteur. Vous trouverez cette fonction documentée dans GoldRush.js.

Un trait assez audacieux de notre programme est le placement du projecteur de rendu. L’examen du code brut craché par ScriptListener m’a permis de comprendre comment Photoshop code les paramètres de l’ellipse qui positionne visuellement la source lumineuse. Comme ça n’a pas été du gâteau, je livre l’info aux programmeurs qui pourraient en avoir besoin.

Figure 6 - Positionnement du projecteur dans le système de coordonnées interne...

La figure 6 montre le résultat de mes investigations. Par souci de simplification, j’ai représenté le système de coordonnées interne dans un carré bien qu’il s’agisse en réalité d’un cadre rectangulaire (celui que vous voyez dans la fenêtre de rendu). L’origine du système est placé en haut à gauche, le sommet opposé ayant pour coordonnées (100,100).

L’abscisse 100 et l’ordonnée 100 ne reflètent pas la même distance puisque la surface-support est en réalité un rectangle plutôt qu’un carré. Il faut donc les comprendre comme des « pourcentages » : 100 % en largeur et 100 % en hauteur.

Le calque sur lequel agit l’éclairage est inscrit au milieu du support (en blanc sur la figure). On voit donc que le projecteur peut être placé très au-delà des limites du calque, et même au-delà du support puisque des coordonnées telles que (150, 200) ne provoquent pas d’erreur.

Les abscisses et ordonnées des objets sont codées par l’intermédiaire des identifiants "Hrzn" et "Vrtc". Le point central de l’ellipse, noté P sur la figure, est rattaché à l’identifiant "Pstn". L’emplacement de la source lumineuse (point rouge V0 sur la figure) est codé dans un objet identifié à la chaîne "Vct0", tandis que le point vert V1 est attaché à la chaîne "Vct1".

On peut s’étonner que Photoshop ait besoin des coordonnées complètes de V1 pour construire l’ellipse, considérant que la distance [P,V1] serait une information suffisante pour parachever cette construction (pourvu que PV0 et PV1 soient orthogonaux).

Je vous renvoie au programme complet pour découvrir en profondeur le reste des coulisses de GoldRush.

Le script GoldRush : mode d’emploi

Depuis la version 1.1, l’interface de GoldRush a été quelque peu améliorée. Elle est désormais bilingue. Consultez le fichier readme.txt pour basculer tous les messages en anglais.

L’installation de GoldRush pour Photoshop CS ou CS2 se fait comme de coutume : copie du fichier GoldRush.js dans le sous-dossier Paramètres prédéfinis/Scripts/ de l’application (ou Presets/Scripts/ pour la VO).

On peut alors lancer le script via Fichier › Scripts › GoldRush. Pour le commander par un simple raccourci-clavier, enregistrez d’abord un « script » Photoshop intitulé « RunGoldRush » (palettes « Scripts »), qui se résumera à exécuter l’action Fichier › Scripts › GoldRush. Activez ensuite la vignette RunGoldRush dans la palette « Scripts » et choisissez « Options de script... » dans le menu optionnel (petite flèche noire).

Figure 7 - Comment lancer GoldRush via un raccourci clavier...

GoldRush est maintenant opérationnel. Pour le tester, ouvrez ou créez un document. Créez alors un calque Texte et tapez quelques lettres dans une police choisie (la couleur des caractères sera sans incidence). Vous pouvez aussi créer un calque standard et dessiner une forme quelconque, ou bien ne rien dessiner du tout et délimiter une simple sélection (y compris sur le calque d’arrière-plan). Le programme prend en compte ces différents contextes de la façon suivante : si une sélection est active, elle constituera la couche de travail ; sinon GoldRush agit sur le contenu du calque actif (il renonce évidemment à travailler si le calque est vide et si aucune sélection n’est active).

Lorsque vous lancez le script (par le raccourci choisi ci-dessus), une boîte de dialogue modale s’affiche devant vos yeux ébahis :

Figure 8a - Boîte de dialogue GoldRush en VF Figure 8b - Boîte de dialogue GoldRush en anglais

Rubrique « Effet »

Chanfrein (léger|moyen|fort) : règle l’intensité du biseautage apparent exercé sur la forme, c’est-à-dire l’effet de relief intérieur. Techniquement, ce paramètre est répercuté à la fois sur l’élévation (relief) du filtre d’éclairage et sur l’intensité du flou gaussien appliqué à la couche alpha. Plus le chanfrein sera fort, plus l’objet texturé va sembler prendre du volume et s’arrondir.

Brillance (0 — 100) : la brillance commande à la fois l’intensité de la lumière projetée et la dureté de la sinusoïde détachant les niveaux. Ainsi, une brillance faible rend l’objet mat et peu contrasté, alors qu’une brillance forte crée des reflets violents et un contraste élevé.

Position de la lumière : un jeu de 8 boutons-radio vous permet de placer la source lumineuse par rapport au centre du calque. Par défaut, le projecteur est au Sud-Est. Si la forme à texturer se situe dans un coin de votre document, il peut être utile de positionner l’éclairage en conséquence.

Relief inversé : cette option correspond à celle intitulée « Blanc = haut » dans le filtre de rendu éclairage. Lorsque la case est cochée, la lumière éclaire l’objet comme s’il était en creux. Cela provoque des inversions de luminosité intéressantes sur les bordures du relief.

Rubrique « Post-traitement »

Détourage (serré|moyen|large) : une fois le filtre appliqué, la forme est extraite de la surface éclairée. Comme elle a pris plus ou moins de volume selon le chanfrein et l’éclairage, le détourage initial (couche alpha) doit être « dilaté » de plusieurs pixels pour révéler complètement le relief. GoldRush calcule autant que possible le réglage optimal (détourage serré), mais vous pouvez l’augmenter pour révéler davantage de relief. Par exemple, un détourage large sur une forme peu chanfreinée fait apparaître davantage la surface dans laquelle l’objet est « incrusté ».

Ombrage : cochez cette case pour automatiser l’application d’un style « Ombre portée » sur le calque. Vous pourrez par la suite modifier les paramètres (distance, fusion...) de cet ombrage en affichant les effets de style attachés au calque.

Teinte (Or, Argent, Bleu métal, Émeraude, Rubis) : GoldRush a été conçu avant tout pour créer des textures dorés. Pour ce faire, il applique un style « Incrustation couleur » en mode Lumière avec une teinte RVB correctement ajustée. D’autres teintes ont été programmées, chacune avec un mode de fusion adéquat. Tout comme l’ombrage, ce paramètre est modifiable a posteriori (effets de style attachés au calque).

Fusionner les calques de travail : le programme exploite, comme vous le savez, un calque de réglage Courbes pour fabriquer les miroitements. Par défaut, ce calque est fusionné avec le calque final afin de désencombrer la palette « Calques ». Si vous souhaitez contrôler a posteriori les points de la sinusoïde, décochez cette case. Le calque de réglage persiste alors sur sa cible en mode « calque d’écrétage ».

Notez que GoldRush ne touche pas à votre calque original : il en crée un tout neuf et se contente de rendre invisible l’ancien. Vous pouvez donc, sans dommage, supprimer le calque « goldrushé » si l’effet ne vous convient pas et repartir sur votre modèle de départ.

Problème connu. — Ce programme a été développé avec le plus grand soin — comme on dit chez Microsoft... — mais il n’est probablement pas exempt de quelques bugs mineurs si vous le poussez dans ses derniers retranchements. En l’occurrence, mes premiers beta-testeurs m’ont fait observer que le filtre Éclairage est susceptible de se mettre aux abonnés absents dans certaines conditions exceptionnelles. Il s’agit en fait d’un bug Photoshop qui n’a nullement besoin de GoldRush pour se manifester ! En pareille extrémité, le script signalera le problème et vous recommandera de quitter et de relancer l’application, ce qui est habituellement la seule manière de réactiver un filtre anormalement déchargé. N’hésitez pas à me faire part de vos remarques ou des autres cruelles découvertes que vous pourriez faire...

Le pack GoldRush.zip contient le fichier GoldRush.js ainsi que deux fichiers explicatifs : lisezmoi.txt pour les francophones, readme.txt pour les autres !

GoldRush a été testé sous Photoshop CS2 mais il fonctionne aussi sous CS1 avec une petite limitation due à l’inexistence du contrôle listbox.

Ce programme est bien sûr en libre usage, mais n’oubliez pas d’indiquer la source et l’auteur si vous le mentionnez ou le réexploitez. Merci de signaler tout bug éventuel à l’adresse du rédacteur en chef.

Télécharger goldrush.zip (13 Ko)

Un petit exemple pour la route...

Démonstration de GoldRush...

BlogNot! est une émission produite par Marc Autret depuis 2004, à consommer de préférence en cuves acclimatées aux spécifications XHTML et CSS.
Pour harceler la rédaction : marcautret(at)free(point)fr