替换智能对象迭代 PNG 批量模型的本地子文件夹的脚本存在问题

问题描述 投票:0回答:1

你好,我是 Gianni,一名来自意大利的 18 岁学生。

我会很感激任何人,即使是那些费心阅读整条消息的人,因为我对这个话题完全无助和无知,哈哈。

我正在尝试在 Photosop 上使用一个工作脚本,这将使我能够自动用本地目录中找到的 png 替换 Photoshop 文件上的智能对象,并将每个文件保存为 jpg。

这是我想要实现的详细步骤:

给定psd文件中名为“smart”的活动层智能对象,并给定fold_A =“C:\Users\Utente\Desktop\PROVA - Copia - Copia (5) - Copia - Copia - Copia - Copia - Copia”,我需要代码来遍历每个子文件夹的子文件夹以及满足此条件的每个 png 文件:

  • 它是一个 png 文件,并且包含在一个名为“white”的文件夹中。

代码必须获取此 png 并将其替换到智能对象中。

执行此操作后,代码必须将包含所有图层的文件导出为 100% 质量的 jpg,名称为“[父文件夹的名称(在本例中为“white”)] + “SCAMBIABRO”+ [名称png]”,它必须将此 jpg 保存到每次导出都需要调整的路径中,如下所示:

与采用的png路径相同,但将fold_A更改为fold_B = "C:\Users\Utente\Desktop\Hoodie" 。例如:

如果 png 取自“C:\Users\Utente\Desktop\PROVA - Copia - Copia (5) - Copia - Copia - Copia - Copia - Copia heetsina 缺乏”

然后 jpg 必须保存到“C:\Users\Utente\Desktop\Hoodie heetsina miss”中。

完成此操作后,代码必须对每个符合条件的 png 执行相同的过程,替换旧 png 的旧智能对象,删除旧 png 并将其替换为新 png,并执行相同的操作,直到完成所有符合条件的 png。符合标准。每次将 png 保存到新路径时,代码都必须打印它,并且完成所有代码后,必须打印“FINITO”。

我确实没有 Javascript 和 Photoshop 代码的编码知识,但是我尝试过运行此代码:

`` #目标photoshop

function processFolder(folder, fold_A, fold_B) {
var files = folder.getFiles();
for (var i = 0; i < files.length; i++) {
var file = files[i];
if (file instanceof Folder) {
if (file.name.toLowerCase() === "white") {
processFolder(file, fold_A, fold_B);
} else {
processFolder(file, fold_A, fold_B);
}
} else if (file.name.toLowerCase().endsWith(".png") && folder.name.toLowerCase() === "white") {
replaceAndSave(file, fold_A, fold_B);
}
}
}

function replaceAndSave(pngFile, fold_A, fold_B) {
var smartObjectLayer = app.activeDocument.layers.getByName("smart");
smartObjectLayer = replaceContents(pngFile, smartObjectLayer);

var jpgSaveOptions = new JPEGSaveOptions();
jpgSaveOptions.quality = 12;

var newFilePath = pngFile.path.replace(fold_A, fold_B);
var newFileName = "whiteSCAMBIABRO" + pngFile.name.replace(".png", ".jpg");
var newFile = new File(newFilePath + "/" + newFileName);

app.activeDocument.saveAs(newFile, jpgSaveOptions, true, Extension.LOWERCASE);
$.writeln("Saved: " + newFile);
}

function replaceContents(newFile, theSO) {
app.activeDocument.activeLayer = theSO;
var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
var desc3 = new ActionDescriptor();
var idnull = charIDToTypeID("null");
desc3.putPath(idnull, new File(newFile));
var idPgNm = charIDToTypeID("PgNm");
desc3.putInteger(idPgNm, 1);
executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
return app.activeDocument.activeLayer;
}

 var fold_A = "C:\\Users\\Utente\\Desktop\\PROVA - Copia - Copia (5) - Copia - Copia - Copia - Copia - Copia";
var fold_B = "C:\\Users\\Utente\\Desktop\\Hoodie";

var startFolder = new Folder(fold_A);
processFolder(startFolder, fold_A, fold_B);

$.writeln("FINITO");``

我想出了使用这个https://github.com/MarshySwamp/JJMack-Archive/blob/mainhttps://github.com/joonaspaakko/Batch-Mockup-Smart-Object-Replacement -photoshop-script固定文件夹中智能对象的 Photoshop 脚本。和https://community.adobe.com/t5/photoshop-ecosystem-discussions/batch-replace-smart-objects-with-exis...

但是它不起作用,我不知道如何修复它。

javascript automation photoshop photoshop-script
1个回答
0
投票

好吧,假设你是真人而不是机器人......

您需要清楚地解释您的文件夹结构 - 您没有提及源 .psd 文件所在的位置或任何内容。

将四个脚本放在一起并希望它们能够正常工作实际上是行不通的。一次一个地检查它们,一次运行一次,看看是否有效以及您需要做什么来改变它。

所以...首先会失败的是 processFolder 函数中的“.endsWith”在 PhotoshopScripting 中不起作用,因为它太新了(或者至少对我来说是这样)。PS 脚本使用 ECMA 脚本而不是最新的 JavaScript .但是我们可以用正则表达式来替换它

else if (file.name.match(/\.(png)$/i) && folder.name.toLowerCase() === "white")

接下来,如果您的源文件已打开,并且您当前的图层是名为“smart”的 SmartObject 图层,您只需调用操作管理器代码来处理该图层并将其交换为我们刚刚找到的 PNG。

function replaceContents(newFile) 
{
  var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
  var desc3 = new ActionDescriptor();
  var idnull = charIDToTypeID("null");
  desc3.putPath(idnull, new File(newFile));
  var idPgNm = charIDToTypeID("PgNm");
  desc3.putInteger(idPgNm, 1);
  executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
}

所以现在可以了。您所要做的就是将其另存为 jpg 格式。这里的问题是将整个路径名(带斜杠)而不只是“文件夹 A”交换为“文件夹 B” - 我们假设它存在 - 代码中没有对此进行检查!

所以把整个事情放在一起:

// Switch off any annoying dialog boxes
displayDialogs = DialogModes.ERROR; // OFF 

var fold_A = "D:\\temp\\process_images\\folder_A";
var fold_B = "D:\\temp\\process_images\\folder_B";

var startFolder = new Folder(fold_A);

processFolder(startFolder, fold_A, fold_B);


alert("FINITO");

function AndSave(pngFile, fold_A, fold_B)
{
  var smartObjectLayer = app.activeDocument.layers.getByName("smart");
  smartObjectLayer = replaceContents(pngFile, smartObjectLayer);

  var jpgSaveOptions = new JPEGSaveOptions();
  jpgSaveOptions.quality = 12;

  var newFilePath = pngFile.path.replace("folder_A", "folder_B");
  var newFileName = "whiteSCAMBIABRO" + pngFile.name.replace(".png", ".jpg");
  var newFile = new File(newFilePath + "/" + newFileName);

  app.activeDocument.saveAs(newFile, jpgSaveOptions, true, Extension.LOWERCASE);
  alert("Saved: " + newFile);
}


function replaceContents(newFile) 
{
  var idplacedLayerReplaceContents = stringIDToTypeID("placedLayerReplaceContents");
  var desc3 = new ActionDescriptor();
  var idnull = charIDToTypeID("null");
  desc3.putPath(idnull, new File(newFile));
  var idPgNm = charIDToTypeID("PgNm");
  desc3.putInteger(idPgNm, 1);
  executeAction(idplacedLayerReplaceContents, desc3, DialogModes.NO);
}


function processFolder(folder, fold_A, fold_B)
{
  var files = folder.getFiles();
  for (var i = 0; i < files.length; i++) 
  {
  var file = files[i];
  if (file instanceof Folder) {
  if (file.name.toLowerCase() === "white") 
  {
  processFolder(file, fold_A, fold_B);
  } else {
  processFolder(file, fold_A, fold_B);
  }
  } else if (file.name.match(/\.(png)$/i) && folder.name.toLowerCase() === "white") 
  {
    replaceContents(file);
    AndSave(file, fold_A, fold_B);
  }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.