Watermark EXIF sous Photoshop CS2

Si vous regardez les version « grand format » de mes photos, vous aurez remarqué ce petit encart :

Je vais expliquer dans ce billet comment le créer automatiquement à l’aide du language de script de Photoshop CS2.

Mise à jour :Nouvelle version.

Commençons par poser les bases :

  • Je n’ai testé ce script qu’avec Photoshop CS2, sous Windows 2000 et avec des photos issues de mon Canon 350D. Toute autre utilisation nécessitera surement des aménagements.
  • Le script est au format JSX, extention du language Javascript grâce aux objets COM exportés par Photoshop. Son utilisation ne nécessite aucune connaissance particulière, sa compréhension sera grandement facilité par la maitrise du langage de script Javascript ou au moins une connaissance du C.
  • Pour qu’un script apparaisse dans le menu Fichier/Script de CS2, il faut le copier dans le sous-répertoire « C:\Program Files\Adobe\Adobe Photoshop CS2\Paramètres prédéfinis\Scripts\ »
  • J’ai pris pour base un script déjà existant écrit par mlk de kirupaforum. Tout le crédit de la création lui en revient donc.
  1. // Pour être sur que la fenêtre de photoshop soit active
  2. #target photoshop
  3. app.bringToFront();
  4. // A décommenter si l’on veux déboger le script
  5. /*
  6. debug level: 0-2 (0:disable, 1:break on error, 2:break at beginning)
  7. $.level = 0;
  8. debugger; // launch debugger on next line
  9. */
  10. // Pas de questions pendant le script
  11. displayDialogs = DialogModes.NO;
  12. // On sauvegarde et met en place les unités de mesure
  13. var defaultRulerUnits = preferences.rulerUnits;
  14. preferences.rulerUnits = Units.PIXELS;
  15. var defaultTypeUnits = preferences.typeUnits;
  16. preferences.typeUnits = TypeUnits.PIXELS;
  17. // Quelques variables fort utiles pour la suite
  18. var AD = activeDocument;
  19. var black = new SolidColor();
  20. black.rgb.red = black.rgb.green = black.rgb.blue = 0;
  21. var white = new SolidColor();
  22. white.rgb.red = white.rgb.green = white.rgb.blue = 255;
  23. backgroundColor = black;
  24. var header =  » 133434 « ;
  25. // Nous allons chercher les infos qui nous interessent dans la liste des infos EXIF
  26. for(n = 0; n < AD.info.exif.length; n = n + 1 ) {
  27.         var stringTemp = AD.info.exif[n][1];
  28.         // J’ai trouvé ces référence à coup d’essais, le nom de variable devraient être
  29.         // en toutes lettres, probablement un problème de traduction.
  30.         // Durée d’exposition
  31.         if(stringTemp.indexOf( » 133434″)!=-1){
  32.                 var expTime = stringTemp.substr(header.length,stringTemp.length-header.length);
  33.         }
  34.         // Date de prise de vue
  35.         if(stringTemp.indexOf( » 136867″)!=-1){
  36.                 var phoTime = stringTemp.substr(header.length,stringTemp.length-header.length);
  37.                 var dateArray1 = phoTime.split( » « , 1);
  38.                 phoTime = dateArray1[0];
  39.                 var dateArray2 = phoTime.split(« : »);
  40.                 var monthsArray =[« Janvier », « Février », « Mars », « Avril », « Mai », « Juin », « Juillet », « Août », « Septembre », « Octobre », « Novembre », « Décembre »];
  41.                 phoTime = dateArray2[2] + » « + monthsArray[dateArray2[1]-1]+ » « +dateArray2[0];
  42.         }
  43.         // Modèle d’appareil photo
  44.         if(stringTemp.indexOf( » 100272″)!=-1){
  45.                 var cameraModel = stringTemp.substr(header.length,stringTemp.length-header.length);
  46.         }
  47.         // Ouverture focale
  48.         if(stringTemp.indexOf( » 133437″)!=-1){
  49.                 var FStop = stringTemp.substr(header.length,stringTemp.length-header.length);
  50.         }
  51.         // Règlage ISO
  52.         if(stringTemp.indexOf( » 134855″)!=-1){
  53.                 var ISO = stringTemp.substr(header.length,stringTemp.length-header.length);
  54.         }
  55.         // Longueur focale
  56.         if(stringTemp.indexOf( » 137386″)!=-1){
  57.                 var FLength = stringTemp.substr(header.length,stringTemp.length-header.length);
  58.         }
  59. }
  60. var Off7 = 7;    // Distance entre le texte et le cadre
  61. var Undent = 6// Distance entre le cadre et le bord de la photo
  62. var TxtSize = 6; // Taille du texte
  63. // On crée un nouveau calque texte
  64. var infoLayer = AD.artLayers.add();
  65. infoLayer.kind = LayerKind.TEXT;
  66. infoLayer.name = « Exif WM – Texte »
  67. var TI = infoLayer.textItem;
  68. TI.font = « Verdana »;
  69. TI.size = TxtSize;
  70. TI.color = white;
  71. // Voici le texte, « \u000D » représente un retour chariot ( caractère n°13, D en hexadécimal)
  72. TI.contents = cameraModel
  73. TI.contents = TI.contents + « \u000D » + FLength +  »  «  + expTime +  »  «  + FStop +  »  «  + ISO +  » ISO »;
  74. TI.contents = TI.contents + « \u000D » + « © « + phoTime + » NH »;
  75. TI.kind = TextType.PARAGRAPHTEXT;
  76. TI.nobreak = true;
  77. // On récupère la taille du texte
  78. var TextWidth  = (infoLayer.bounds[2]-infoLayer.bounds[0]);
  79. var TextHeight = (infoLayer.bounds[3]-infoLayer.bounds[1]);
  80. var TextLeft = AD.width-(TextWidth + Off7 * 2 + Undent);
  81. var TextTop = AD.height-(TextHeight + Off7 * 2 + Undent);
  82. // Et on le déplace en bas à gauche, position calculées avec les distances mises en place plus haut
  83. TI.position = [TextLeft,TextTop];
  84. // On crée un nouveau calque, pour y dessiner notre cadre
  85. var CadreLayer = AD.artLayers.add();
  86. CadreLayer.name = « Exif WM – Cadre »;
  87. var CadreRight = TextLeft + TextWidth + Off7;
  88. var CadreBottom = TextTop + TextHeight + Off7;
  89. // cadre dont la taille et la position sont calculées selon celles du texte
  90. var selectionBounds = [[TextLeft-Off7, TextTop-Off7], [CadreRight, TextTop-Off7], [CadreRight, CadreBottom], [TextLeft-Off7, CadreBottom]];
  91. // On crée une sélection
  92. AD.selection.select(selectionBounds,SelectionType.REPLACE,0,false);
  93. // On la remplis d’un aplat de noir visible à 35% ( transparent à 65% donc )
  94. AD.selection.fill(black,ColorBlendMode.VIVIDLIGHT,35);
  95. // Puis on trace le contour blanc visible à 100%
  96. AD.selection.stroke(white,3,StrokeLocation.OUTSIDE, ColorBlendMode.VIVIDLIGHT, 100, false);
  97. AD.selection.deselect();
  98. // On place le texte au dessus du cadre ( pour qu’il ne soit pas affecté par l’aplat noir )
  99. infoLayer.move(CadreLayer,ElementPlacement.PLACEBEFORE);
  100. // On lie les deux calques ( ils bougeront ensemble )
  101. CadreLayer.link(infoLayer);
  102. // on remet en place les unités de mesure sauvegardées
  103. preferences.rulerUnits = defaultRulerUnits;
  104. preferences.typeUnits = defaultTypeUnits;
  105. // On pourrait applatir les calques
  106. /*
  107. AD.flatten();
  108. */
  109. // On pourrait sauvegarder automatiquement le résultat
  110. /*
  111. jpgFile = new File( « /Temp001.jpeg » )
  112. jpgSaveOptions = new JPEGSaveOptions()
  113. jpgSaveOptions.embedColorProfile = true
  114. jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE
  115. */