【问题标题】:A Script to Find Average Colors of all Layers/Images in Photoshop and Save with Filename of Average Color在 Photoshop 中查找所有图层/图像的平均颜色并使用平均颜色的文件名保存的脚本
【发布时间】:2018-02-01 21:40:31
【问题描述】:

我有一个包含 300 多种个人资料皮肤色调的文件夹,我必须按颜色从浅色调到深色调进行分类。我可以创建一个动作来获取每种肤色的平均颜色,但我无法自动重命名文件以匹配每种颜色以进行识别。

是否可以创建一个脚本来查找文件夹中每个图像的平均颜色(整张照片的;我通常只是滤镜>模糊>平均图层),然后使用 RGB 或十六进制保存新图像在原始文件名之前添加的平均颜色的名称?

EX:在脚本过滤器>模糊>平均层之后。 skintone01.jpg 的平均颜色为 #ad8475,因此它将文件重命名为 ad8475-skintone01.jpg

另外,我不确定这是否可行,但有没有办法使用脚本根据其平均颜色排列所有图层。我不认为它可以,但既然我们在这个话题上,不妨把它拿出来。

编辑:我刚刚测试了几张照片,发现按 HEX 排序并不理想,因为 Windows 以奇怪的顺序对十六进制代码进行排序。到目前为止,我发现只要三个数字之间有空格,按 RGB 数字排序是理想的。

EX:如果平均颜色 RGB 为 110 73 58,那么脚本会将新文件命名为“110 73 58 skintone01.jpg”而不是“1107358 skintone01.jpg”。同样,这是由于 Windows 对文件进行排序的方式。

**基本上,这就是我想要对文件夹中每张照片的脚本执行的操作:

  1. 复制层
  2. 滤镜 > 模糊 > 平均
  3. 复制当前图层的 RGB 值
  4. 使当前图层(具有平均颜色的图层)不可见
  5. 在原始文件名之前使用 RGB 值保存图像(每个 RBG 值之间有一个空格)。**

【问题讨论】:

  • 这是一个有趣的问题。而且我想我知道你要去哪里。澄清一下,不知道你的源图像实际上是什么样子:你有平均模糊前后的皮肤结石图像的例子吗?您目前是否手动选择您从中获取 RGB 值的图像上的位置?除了第 3 阶段,脚本应该是直截了当的,这是棘手的部分。
  • 非常感谢您帮助我解决这个问题。以下是肤色link 及其平均值link 的示例图像,使用模糊> 整个图像的平均值。因为我正在对整个图像的重复图层进行平均,所以我从哪里制作 RGB 值并不重要。是的,第 3 部分及以后的部分是棘手的部分,因为仅使用 PSP 动作是不可能的,但我也不熟悉脚本。

标签: javascript photoshop photoshop-script


【解决方案1】:

好的,这就是你需要的:

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

我在做这个盲人,不过应该可以。

【讨论】:

  • 哦,非常感谢!我刚刚完成了测试,Adobe 正在抛出一个错误“srcDoc.activeLayer.applyAvergeBlur(avg);”不是函数。
  • 我已将其更改为 applyAverage();反而。现在就试一试
  • 修复工作,但现在它抛出了这个错误:link。我认为这可能与它模糊底层而不是重复的这一事实有关。
  • 玩了一会儿之后,我在复制图层部分之后添加了一些代码,以便脚本选择“模糊”图层activeDocument.activeLayer = activeDocument.artLayers.getByName("blurred");
【解决方案2】:

非常感谢你,食尸鬼!

我玩弄了您的脚本并进行了一些研究,并设法修复了 Photoshop 对我的错误。我还根据自己的喜好做了一些调整。这是我正在使用的结果代码:

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

我所做的只是在平均之前激活“模糊”层,然后更改复制 RGB 值的编码以适应采样代码中的值。然后我添加了代码,以便将结果四舍五入到小数点后 3 位。

在我尝试查看是否可以让脚本将所有新图像保存到新文件夹后,但不知道如何。哈哈。但至少我得到了它的工作。

非常感谢您的帮助。如果没有你,我将无法做到这一点,并且可能会坐在我的电脑前几个小时。 :D

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多