2017-08-24 6 views
3

J'ai un dossier de 300 + skintones de profil que je dois trier par couleur des tons clairs au ton foncé. Je peux créer une action pour obtenir les couleurs moyennes pour chacun des skintones, mais je ne serai pas capable de renommer le fichier automatiquement pour correspondre à chaque couleur avec laquelle s'identifier.Un script pour trouver les couleurs moyennes de tous les calques/images dans Photoshop et enregistrer avec le nom de la couleur moyenne

Est-il possible de créer un script qui va trouver la couleur moyenne (de la photo entière, je filtre juste habituellement> Flou> Moyenne du calque) pour chaque image dans le dossier et ensuite enregistrer la nouvelle image avec le RVB ou Nom hexadécimal de la couleur moyenne ajoutée avant le nom de fichier d'origine? EX: Après le script Filtre> Flou> Moyenne du calque. La couleur moyenne pour skintone01.jpg est # ad8475 donc il va renommer le fichier en ad8475-skintone01.jpg

Aussi, je ne suis pas sûr que ce soit possible, mais y a-t-il un moyen d'arranger toutes les couches conformément à sa couleur moyenne en utilisant le script. Je ne pense pas que cela puisse figurer, puisque nous sommes sur ce sujet, autant que nous le sachions.

EDIT: J'ai juste testé quelques-unes des photos et trouvé que le tri par HEX n'est pas idéal car Windows trier le code hexadécimal dans un ordre étrange. Jusqu'à présent, j'ai trouvé que le tri par numéro RVB est idéal tant qu'il y a des espaces entre les trois nombres. EX: Si le RVB couleur moyen est 110 73 58, le script appellera le nouveau fichier "110 73 58 skintone01.jpg" et non "1107358 skintone01.jpg". Encore une fois, cela est dû à la manière dont Windows trient les fichiers.

** Bascially, ce que je veux faire avec le script pour chaque photos dans le dossier:

  1. double couche
  2. Filtre> Flou> Moyenne
  3. valeurs RVB Copie de la couche actuelle
  4. Turn couche courante (une avec la couleur moyenne) invisible
  5. Enregistrer l'image avec les valeurs RGB avant le nom de fichier original (avec un espace entre chaque valeur RBG). **
+0

Ceci est une question intéressante. Et je pense que je sais où tu vas avec ça. Pour clarifier, ne sachant pas à quoi ressemblent vos images sources: avez-vous un exemple de l'image de la peau avant et après le flou moyen? Êtes-vous actuellement en train de sélectionner manuellement les informations sur l'image à partir de laquelle vous faites les valeurs RVB? Le script devrait être simple en dehors de l'étape 3, qui est la partie délicate. –

+0

Merci beaucoup de m'avoir aidé avec ça. Voici des exemples d'image d'un skintone [link] (https://imagez.to/i/B6vBxm5x.png) et sa moyenne [link] (https://imagez.to/i/5CzOW8g9.jpg) en utilisant le flou> moyenne de l'image entière. Parce que je fais la moyenne de la couche dupliquée de l'image entière, il n'a pas d'importance d'où j'ai fait la valeur RVB. Oui, la partie 3 et la suivante sont la partie délicate car il n'est pas possible de faire juste avec des actions PSP mais je ne suis pas familier avec les scripts. –

Répondre

2

Merci beaucoup, Ghoul Fool!

J'ai joué avec votre script avec quelques recherches et réussi à corriger l'erreur Photoshop thew à moi. J'ai aussi fait quelques réglages à mon goût. Ce sont les codes résultants j'utilise:

// Set reference for active document 
var srcDoc = app.activeDocument; 

// get filename 
myFileName = srcDoc.name; 
//docName = myFileName.substring(0,myFileName.lastIndexOf(".")); 

//Duplicate Layer and call it "blurred" 
var layerName = "blurred"; 
srcDoc.activeLayer.duplicate().name = layerName; 

//Select "Blurred" Layer 
activeDocument.activeLayer = activeDocument.artLayers.getByName("blurred"); 

// Filter > Blur > Average 
srcDoc.activeLayer.applyAverage(); 

// remove any sample first 
srcDoc.colorSamplers.removeAll(); 

// get width and height of image 
var w = srcDoc.width.value; 
var h = srcDoc.height.value; 

// get positions of the center of the image 
//var x = 0; 
//var y = 0; 
var x = Math.round(w/2); 
var y = Math.round(h/2); 

// will pick a sample from the middle of the image 
var px = [UnitValue(x) , UnitValue(y)]; 
var skinSampler = srcDoc.colorSamplers.add(px); 

// Copy RGB Values of current layer with 3 decimal spaces 
var myColor = skinSampler.color; 
var rgb_R = Math.round(myColor.rgb.red*1000)/1000; 
var rgb_G = Math.round(myColor.rgb.green*1000)/1000; 
var rgb_B = Math.round(myColor.rgb.blue*1000)/1000; 

// remove that sample no we know it's value 
srcDoc.colorSamplers.removeAll(); 

// Turn current layer (one with the average color) invisible 
srcDoc.activeLayer.visible = false; 

// Save image with RGB values before the original filename (with a space between each RBG value). 
mySaveName = rgb_R + " " + rgb_G + " " + rgb_B + " " + myFileName; 

// Set filePath and fileName to source path 
var filePath = srcDoc.path + "/" + mySaveName; 

// save as jpeg 
jpegIt(filePath, 12); 

// function for saving as jpeg 
function jpegIt(filePath, myJpgQuality) 
{ 
    if(! myJpgQuality) myJpgQuality = 12; 

    // Flatten the jpg 
    activeDocument.flatten(); 

    // jpg file options 
    var jpgFile = new File(filePath); 
    jpgSaveOptions = new JPEGSaveOptions(); 
    jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE; 
    jpgSaveOptions.embedColorProfile = true; 
    jpgSaveOptions.matte = MatteType.NONE; 
    jpgSaveOptions.quality = myJpgQuality; 

    activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE); 

    //close without saving 
    app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); 
} 

Tout ce que je ne faisais que faire la couche « floue » active avant moyenne, puis modifier le codage pour la copie valeur RVB pour adapter les valeurs à partir du code d'échantillonnage. Puis j'ai ajouté les codes afin qu'il arrondisse le résultat jusqu'à 3 points décimaux.

Après avoir essayé de voir si je peux obtenir le script pour enregistrer toutes les nouvelles images dans un nouveau dossier, mais n'a pas pu comprendre comment. LOL. Mais au moins je l'ai fait fonctionner.

Merci beaucoup pour votre aide.Je ne serais pas capable de le faire sans vous et serais probablement assis devant mon ordinateur pendant des heures. : D

1

Ok, voici ce que vous avez le besoin:

// Set reference for active document 
var srcDoc = app.activeDocument; 

// get filename 
myFileName = srcDoc.name; 
//docName = myFileName.substring(0,myFileName.lastIndexOf(".")); 

//Duplicate Layer and call it "blurred" 
var layerName = "blurred"; 
srcDoc.activeLayer.duplicate().name = layerName; 

// Filter > Blur > Average 
srcDoc.activeLayer.applyAverage(); 


// remove any sample first 
srcDoc.colorSamplers.removeAll(); 

// get width and height of image 
var w = srcDoc.width.value; 
var h = srcDoc.height.value; 

// get positions of the center of the image 
//var x = 0; 
//var y = 0; 
var x = Math.round(w/2); 
var y = Math.round(h/2); 

// will pick a sample from the middle of the image 
var px = [UnitValue(x) , UnitValue(y)]; 
var skinSampler = srcDoc.colorSamplers.add(px); 

// Copy RGB Values of current layer 
var myColour = myColorSampler.color; 
var rgb_R = myColor.rgb.red; 
var rgb_G = myColor.rgb.green; 
var rgb_B = myColor.rgb.blue; 

// remove that sample no we know it's value 
srcDoc.colorSamplers.removeAll(); 

// Turn current layer (one with the average color) invisible 
srcDoc.activeLayer.visible = false; 

// Save image with RGB values before the original filename (with a space between each RBG value). 
mySaveName = rgb_R + " " + rgb_G + rgb_B + myFileName; 

// Set filePath and fileName to source path 
var filePath = srcDoc.path + "/" + mySaveName; 

// save as jpeg 
jpegIt(filePath, 12); 

// function for saving as jpeg 
function jpegIt(filePath, myJpgQuality) 
{ 
    if(! myJpgQuality) myJpgQuality = 12; 

    // Flatten the jpg 
    activeDocument.flatten(); 

    // jpg file options 
    var jpgFile = new File(filePath); 
    jpgSaveOptions = new JPEGSaveOptions(); 
    jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE; 
    jpgSaveOptions.embedColorProfile = true; 
    jpgSaveOptions.matte = MatteType.NONE; 
    jpgSaveOptions.quality = myJpgQuality; 

    activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE); 

    //close without saving 
    app.activeDocument.close(SaveOptions.DONOTSAVECHANGES); 
} 

que je fais ce aveugle, devrait fonctionner bien.

+0

Oh merci beaucoup! Je viens de terminer le test et Adobe renvoie une erreur "srcDoc.activeLayer.applyAvergeBlur (avg);" n'est pas une fonction. –

+0

Je l'ai changé en applyAverage(); au lieu. Essayez-le maintenant –

+0

Le correctif fonctionne, mais maintenant il renvoie cette erreur: [link] (https://imagez.to/i/pT8J29gF.jpg). Je pense qu'il pourrait devoir faire quelque chose avec le fait qu'il est flou la couche inférieure au lieu de la copie. –