Photoshop School Forum

Le petit forum dédié à Photoshop CS5 et ses ancêtres.

Vous n'êtes pas connecté.

Annonce

AttentionN'oubliez pas de consulter nos Tutoriaux
Le forum a quelques problèmes techniques, les mails ne fonctionnent pas pour l'instant...

#1 13-12-2011 17:48:36

vortex_concept
P'tit nouveau
Date d'inscription: 13-12-2011

Question pour les experts...

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

 

#2 13-12-2011 20:58:58

edfred
Jeune Professeur
Lieu: Allemagne
Date d'inscription: 22-11-2007
Site web

Re: Question pour les experts...

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

 

#3 13-12-2011 21:08:45

txuku
Elève bavardeur
Lieu: Bayonne 64
Date d'inscription: 13-10-2009
Site web

Re: Question pour les experts...

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....


________________________________
Avec Photoshop surtout des photos ....

Hors ligne

 

#4 13-12-2011 21:41:44

habaki
Maître des scripts
Date d'inscription: 06-05-2009

Re: Question pour les experts...

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 !). 

Code:

/************************************************************************
                        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)


En cas d'image inaccessible, aller voir le Habaki Blog

Hors ligne

 

#5 14-12-2011 20:50:46

edfred
Jeune Professeur
Lieu: Allemagne
Date d'inscription: 22-11-2007
Site web

Re: Question pour les experts...

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

 

#6 28-09-2012 13:53:07

kherv
P'tit nouveau
Date d'inscription: 28-09-2012

Re: Question pour les experts...

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

 

#7 28-09-2012 15:39:40

txuku
Elève bavardeur
Lieu: Bayonne 64
Date d'inscription: 13-10-2009
Site web

Re: Question pour les experts...

Bonjour kherv

J ai modifie le script d habaki :

au debut  - ligne 7 j ai remplace les jpegOptions par des tifOptions

Code:

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

Code:

Doc.saveAs(new File(TargetPath + "/" + TargetName + ".tif"), tifOptions, true);

Ce qui donne ce script :

Code:

/************************************************************************
                        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);
}

.


________________________________
Avec Photoshop surtout des photos ....

Hors ligne

 

#8 28-09-2012 16:37:25

kherv
P'tit nouveau
Date d'inscription: 28-09-2012

Re: Question pour les experts...

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

 

#9 28-09-2012 17:29:41

edfred
Jeune Professeur
Lieu: Allemagne
Date d'inscription: 22-11-2007
Site web

Re: Question pour les experts...

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

 

#10 28-09-2012 17:53:05

txuku
Elève bavardeur
Lieu: Bayonne 64
Date d'inscription: 13-10-2009
Site web

Re: Question pour les experts...

Je ne pense pas que ce soit indispensable edfred !   smile

kherv tu as les references JavaScript ici : C:\Program Files (x86)\Adobe\Adobe Photoshop CS5\Scripting\Documents - Photoshop CS5 JavaScript Ref.pdf


________________________________
Avec Photoshop surtout des photos ....

Hors ligne

 

#11 10-05-2013 10:39:53

txuku
Elève bavardeur
Lieu: Bayonne 64
Date d'inscription: 13-10-2009
Site web

Re: Question pour les experts...

Bonjour sksay

vers les lignes 8 ou 9 dans les TifOptions tu rajoutes cette ligne :

Code:

tifOptions.imageCompression = TIFFEncoding.TIFFLZW;

par exemple a la place de la ligne

Code:

tifOptions.quality = 12; //Options.quality    = 12;   // Qualite jpeg

qui ne sert a rien.


________________________________
Avec Photoshop surtout des photos ....

Hors ligne

 

Pied de page du Forum


© Copyright Rickard Andersson