Le petit forum dédié à Photoshop CS5 et ses ancêtres.
Vous n'êtes pas connecté.
Bonjour à tous,
Je suis persuadé que Photoshop permet de faire ce que je souhaite mais je ne trouve pas la technique.
Je démarre dans l'utilisation de photoshop et de son système de scripts.
Je démarre mais j'ai beaucoup cherché avant de vous exposer mon besoin/souci.
Description de mon besoin :
J'ai un volume assez important de fichiers images que je souhaite traiter de la façon suivante :
- J'ouvre l'image dont le nom de fichier est Mon_Image.jpg
- Je découpe 3 zones différentes dans cette image (via une selection rectangulaire, toujours aux mêmes endroits de l'image initiale...au pixel près)
- Je dérive 3 claques de ces 3 séléctions précédentes dont les noms sont : Zone1, Zone2 et Zone3
Je voudrais que photoshop me sauve 3 nouvelles images qui s'appelleront : Mon_Image_Zone1.jpg; Mon_Image_Zone2.jpg et Mon_Image_Zone3.jpg
Je n'arrive pas à cela.
J'utilise CS3 sous Windows Vista pour information.
J'ai essayé d'utiliser la fonction "Fichiers/Scripts/Exporter les calques dans des fichiers", une boîte de dialogue apparaît et me permet de mettre en place un préfixe au nom du fichier.
Le problème c'est que je voudrais scripter ce traitement et si je renseigne ce préfixe avec une valeur...elle deviendra statique alors que je souhaiterais que ce prefixe corresponde en fait au nom de mon fichier initial (sans l'extension), soit "MonImage"...c'est un paramètre variable en fait...
N'y a-t-il pas moyen de placer dans ce champs prefix lors de l'enregistrement du script un truc du style "%FILENAME%" ou je ne sais quoi qui soit dynamique et fasse appel à l'environnement instantané de Photoshop?
En gros, comment on récupère le nom du fichier en cours de traitement dans un script photoshop???
Merci de vos lumières...je patine...
Laurent
Hors ligne
Salut.
J'ai la vague impression qu'il va falloir modifier des variable dans le script.
Je te propose d'attendre le passage d'Habaki ou Txuku ! Il sont très bons en javascript.
J'ai essayé d'y jeter un œil, j'ai trouvé la partie à modifier mais ne sais comment !
Hors ligne
Bonjour
Je pense qu il vaut mieux ecrire un script jsx specifique.
Quelles sont tes selections - coordonnees droite gauche haut bas ? Si c est possible de tout faire ensemble....
Hors ligne
Salut vortex_concept, Edfred et Txuku !
D'après mes essais, la sauvegarde des calques en fichiers dans une action enregistrée ne marche pas très bien en traitement par lots. On dirait que tous les calques sont sauvés dans le meme fichier, et il ne reste au final que celui du dernier calque sauvé.
J'ai donc écrit un script (ci-dessous) qui sauve les calques du document courant dans des fichiers, sauf l'arrière plan, en ajoutant un suffixe "_ZoneN.jpg" au nom du document. Ca marche bien.
Il faut donc enregistrer une action qui crée les calques voulus à partir de sélections ou quelque soit la manière, et terminer par l'appel de ce script: Fichier/scripts/parcourir. Puis appeler cette action en traitement par lot sur un ensemble de fichiers.
Dans la fenetre de traitement par lots, ne PAS cocher la case "priorité sur les instructions enregistrer sous".
Ainsi c'est le script seul qui nomme les fichiers résultats et ils se retrouvent dans le répertoire source.
J'ai fait des essais avec le nommage par le traitement par lots et ce n'est pas utilisable. C'était dans la 1ère version de ce message. (Ce traitement par lot de PS n'est vraiment ni fait ni à faire. Il doit surement y avoir des sripts plus performants sur le web! Seules les configurations simplissimes fonctionnent !).
/************************************************************************ Save Layers ************************************************************************ 13/12/2011 Habaki : Creation ************************************************************************/ var Doc = app.activeDocument; var jpegOptions = new JPEGSaveOptions(); jpegOptions.quality = 12; // Qualite jpeg /*----------------------------------------------------------------------* Make a Selection with current Layer *----------------------------------------------------------------------*/ function LayerDoSelection() { var idsetd = charIDToTypeID( "setd" ); var desc90 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref24 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idfsel = charIDToTypeID( "fsel" ); ref24.putProperty( idChnl, idfsel ); desc90.putReference( idnull, ref24 ); var idT = charIDToTypeID( "T " ); var ref25 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idChnl = charIDToTypeID( "Chnl" ); var idTrsp = charIDToTypeID( "Trsp" ); ref25.putEnumerated( idChnl, idChnl, idTrsp ); desc90.putReference( idT, ref25 ); executeAction( idsetd, desc90, DialogModes.NO ); } /*----------------------------------------------------------------------* Crop selection *----------------------------------------------------------------------*/ function SelectionCrop() { var idCrop = charIDToTypeID( "Crop" ); var desc91 = new ActionDescriptor(); executeAction( idCrop, desc91, DialogModes.NO ); } /*----------------------------------------------------------------------* Alt Ctrl Z *----------------------------------------------------------------------*/ function ACZ() { var idslct = charIDToTypeID( "slct" ); var desc95 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref28 = new ActionReference(); var idHstS = charIDToTypeID( "HstS" ); var idOrdn = charIDToTypeID( "Ordn" ); var idPrvs = charIDToTypeID( "Prvs" ); ref28.putEnumerated( idHstS, idOrdn, idPrvs ); desc95.putReference( idnull, ref28 ); executeAction( idslct, desc95, DialogModes.NO ); } /*----------------------------------------------------------------------* Main *----------------------------------------------------------------------*/ try { var i; var L; var TargetPath, TargetName; for (i = 0; i < Doc.layers.length; i++) { L = Doc.layers[i]; if (L.isBackgroundLayer) continue; Doc.activeLayer = L; LayerDoSelection(); SelectionCrop(); // Sauvegarde TargetPath = Doc.path; TargetName = Doc.name.slice(0,-4) + "_Zone" + (i+1); Doc.saveAs(new File(TargetPath + "/" + TargetName + ".jpg"), jpegOptions, true); ACZ(); ACZ(); } // for Doc.close(SaveOptions.DONOTSAVECHANGES); } catch (ex) { alert(ex.message); }
Dernière modification par habaki (15-12-2011 20:45:09)
Hors ligne
Salut Habaki, txuku et vortex_concept.
Ce script est parfait !
J'ai pas testé par lot toutefois.
J'ai modifié un peu le chemin d'enregistrement pour les avoir sur mon bureau.
Une fois de plus, Bravo Habaki !
Hors ligne
Bonjour,
Désolé de faire remonter un post aussi ancien, mais je me posais la même question et j'ai donc utilisé cette solution qui fonctionne à merveille en traitement par lots.
J'avais cependant une petite question, je souhaiterais enregistrer les images traitées en tiff (lzw) et non en jpg.
J'imagine qu'il y a quelques petites choses à modifier dans le script, mais n'y connaissant rien en javascript, si quelqu'un accepterait de m'aider ce serait sympa.
Bonne journée.
Dernière modification par kherv (28-09-2012 13:55:05)
Hors ligne
Bonjour kherv
J ai modifie le script d habaki :
au debut - ligne 7 j ai remplace les jpegOptions par des tifOptions
var tifOptions = new TiffSaveOptions(); //var jpegOptions = new JPEGSaveOptions(); tifOptions.quality = 12; //Options.quality = 12; // Qualite jpeg tifOptions.layers = false; // go to 8 bit activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT;
et a la ligne 72
Doc.saveAs(new File(TargetPath + "/" + TargetName + ".tif"), tifOptions, true);
Ce qui donne ce script :
/************************************************************************ Save Layers ************************************************************************ 13/12/2011 Habaki : Creation ************************************************************************/ var Doc = app.activeDocument; var tifOptions = new TiffSaveOptions(); //var jpegOptions = new JPEGSaveOptions(); tifOptions.quality = 12; //Options.quality = 12; // Qualite jpeg tifOptions.layers = false; // go to 8 bit activeDocument.bitsPerChannel = BitsPerChannelType.EIGHT; /*----------------------------------------------------------------------* Make a Selection with current Layer *----------------------------------------------------------------------*/ function LayerDoSelection() { var idsetd = charIDToTypeID( "setd" ); var desc90 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref24 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idfsel = charIDToTypeID( "fsel" ); ref24.putProperty( idChnl, idfsel ); desc90.putReference( idnull, ref24 ); var idT = charIDToTypeID( "T " ); var ref25 = new ActionReference(); var idChnl = charIDToTypeID( "Chnl" ); var idChnl = charIDToTypeID( "Chnl" ); var idTrsp = charIDToTypeID( "Trsp" ); ref25.putEnumerated( idChnl, idChnl, idTrsp ); desc90.putReference( idT, ref25 ); executeAction( idsetd, desc90, DialogModes.NO ); } /*----------------------------------------------------------------------* Crop selection *----------------------------------------------------------------------*/ function SelectionCrop() { var idCrop = charIDToTypeID( "Crop" ); var desc91 = new ActionDescriptor(); executeAction( idCrop, desc91, DialogModes.NO ); } /*----------------------------------------------------------------------* Alt Ctrl Z *----------------------------------------------------------------------*/ function ACZ() { var idslct = charIDToTypeID( "slct" ); var desc95 = new ActionDescriptor(); var idnull = charIDToTypeID( "null" ); var ref28 = new ActionReference(); var idHstS = charIDToTypeID( "HstS" ); var idOrdn = charIDToTypeID( "Ordn" ); var idPrvs = charIDToTypeID( "Prvs" ); ref28.putEnumerated( idHstS, idOrdn, idPrvs ); desc95.putReference( idnull, ref28 ); executeAction( idslct, desc95, DialogModes.NO ); } /*----------------------------------------------------------------------* Main *----------------------------------------------------------------------*/ try { var i; var L; var TargetPath, TargetName; for (i = 0; i < Doc.layers.length; i++) { L = Doc.layers[i]; if (L.isBackgroundLayer) continue; Doc.activeLayer = L; LayerDoSelection(); SelectionCrop(); // Sauvegarde TargetPath = Doc.path; TargetName = Doc.name.slice(0,-4) + "_Zone" + (i+1); Doc.saveAs(new File(TargetPath + "/" + TargetName + ".tif"), tifOptions, true); ACZ(); ACZ(); } // for Doc.close(SaveOptions.DONOTSAVECHANGES); } catch (ex) { alert(ex.message); }
.
Hors ligne
Merci txuku, et merci également à habaki pour le script original.
Il fonctionne toujours nickel avec de jolis tiff en sortie.
Existe t'il un endroit où les codes spécifiques à photoshop serait regroupés ou expliqués, au cas ou je voudrait sortir du png ou autre chose. Ca m'éviterait de demander à chaque fois et pourquoi pas, si j'y arrive, poster un script modifié.
Bonne fin de journée.
Hors ligne
Salut Txuku.
Une question.
Cette partie : tifOptions.quality = 12; //Options.quality = 12; // Qualite jpeg
Est-elle indispensable sachant que le tif ne subit pas de compression et que ce paramètre concerne justement la compression jpeg ?
Hors ligne
Je ne pense pas que ce soit indispensable edfred !
kherv tu as les references JavaScript ici : C:\Program Files (x86)\Adobe\Adobe Photoshop CS5\Scripting\Documents - Photoshop CS5 JavaScript Ref.pdf
Hors ligne