Javascript按字母顺序和数字顺序将图像导入Photoshop

时间:2019-01-28 17:30:08

标签: javascript photoshop

这是一种JavaScript(不是我的JavaScript),可以按照字母和数字顺序将图像导入到Photoshop中。

脚本运行时:

-用户选择要导入Photoshop的图像文件夹。

-然后按字母和数字顺序导入图像。例如:

  

a.01.png,b.01.png,c.01.png,a.02.png,b.02.png,c.02.png,a.03.png,   b.03.png,c.03.png   ..etc。

脚本运行良好,直到结束。它总是无法从最后一个数值集中获取一张图像。 EX失败:

  

a.01.png,b.01.png,c.01.png,a.02.png,b.02.png,c.02.png,

     

“跳过此处即可进入a.03.png”

     

b.03.png,c.03.png

无论有多少组,最后一组总是无法导入一个图像。其余进口罚款。我还无法弄清楚是什么原因造成的。有人能在下面的脚本中找到问题吗?

更新

我没有提到这是更大的JavaScript中的一段代码,因此PSDcreate和其他项目在其他地方使用。我只是裁掉了失败的部分,因为原始部分太大而无法发布。我运行了您创建的脚本,它确实将它们引入,但与我在我的代码中所做的完全不同。我相信您会带来图片

  

a.00.1png,a.002.png,a.003.png b.001.png,b.002.png,b.003.png,c.001.png,c.002.png,c .003.png ... ect

我正在使用的那个按

的顺序放置
  

a.001.png,b.001.png,c.001.png,a.002.png,b.002.png,c.002png    ...等

我首先将以.001结尾的a,b,c图像导入到Photoshop中。然后在那一点上,我取出的代码然后按顺序(a,b,c)堆叠图像并执行其他各种任务。完成后,将它们另存为PSD文件“ name.001.psd”。然后,脚本引入带002的下一组图像,并循环重复该过程。那是我删除的部分,因为它的代码太多,而且似乎不是问题。

是否可以带来图像
  

.001的a,b,c,然后是.002..etc的a,b,c?

代码:

#target photoshop
app.bringToFront();

// Dialog for user to choose folder of documents to process
var inputFolderArray = [];
do {  
var inputFolder = Folder.selectDialog("Select a folder of documents to process");  
if(inputFolder != null) {
      inputFolderArray.push(inputFolder);
    }
}
while(inputFolder != null
|| inputFolder != undefined)

// Pulls images from inputFolder
for (var j = 0; j < inputFolderArray.length; j++) {
  var filesList = inputFolderArray[j].getFiles();

var outputDirectory = inputFolderArray[j] + '/';

// Sort the order of files corresponding to the number
  filesList.sort(function(x,y) {

// the substr gets the numbers (ex: get "01" from image.01.png)
var xp = (x.name).substr(-6, 2);
    var yp = (y.name).substr(-6, 2);
return parseInt(xp) - parseInt(yp);
  });
  var frameArrays = [[]];
var oldFrameNum = (filesList[0].name).substr(-6, 2);

// These are used for array slice
  var arrayStartNum = 0;
  var arrayEndNum = 1;

// Put each frame into separate array
  for (var i = 1; i < filesList.length; i++) {

var currentFrameNum = (filesList[i].name).substr(-6, 2);
    if(oldFrameNum !== currentFrameNum) {
      oldFrameNum = currentFrameNum;
      frameArrays[0].push(filesList.slice(arrayStartNum, i));
      arrayStartNum = i;
      arrayEndNum = i-1;
    }
    else if(i === filesList.length-1) {
      frameArrays[0].push(filesList.slice(arrayStartNum, i));
    }
  }
  for (var i = 0; i < frameArrays[0].length; i++) {

// Sort the file order alphabetically
    sorter = MySort('*!@_.()#^&%-=+01234567989abcdefghijklmnopqrstuvwxyz');
    frameArrays[0][i].sort(sorter)
    PSDCreate(frameArrays[0][i], outputDirectory);
  }
}


// FUNCTIONS BELOW//
function PSDCreate(frameArrays, outputDirectory) {
  directory = outputDirectory + '/';

//var outputLocation = inputFolder + "/" + directory;
  var outputFileName = '';
  if (frameArrays != null) {

// Get all the files in the folder
    var fileList = frameArrays;
    var k = 0;

    for (var i = 0; i < fileList.length; i++) {
      if (fileList[i] instanceof File && fileList[i].hidden == false) {

var fileName = fileList[i].name;
        var docRef = open(fileList[i]);

        if(k == 0) {
          k++;
          outputFileName = RemoveExtension(docRef.name);
        }
      }
    } 
  }
}

// Removes extension from file name
function RemoveExtension(name) {
  var fileNameNoExtension = name;
  fileNameNoExtension = fileNameNoExtension.split(".");
  if ( fileNameNoExtension.length > 1 ) {
    fileNameNoExtension.length--;
  }
  fileNameNoExtension = fileNameNoExtension.join(".");
  return fileNameNoExtension;
}

// Sort the file order alphabetically with special characters
function MySort(alphabet)
{
    return function(a, b) { 
var index_a = alphabet.indexOf(a[0]),
        index_b = alphabet.indexOf(b[0]);
        if (index_a === index_b) {

// same first character, sort regular
            if (a < b) {
                return -1;
            } else if (a > b) {
                return 1;
            }
            return 0;
        } else {
            return index_a - index_b;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我无法弄清楚为什么丢失了一个数组元素:您的排序令我很困惑,所以我重新编写了排序,我认为它更容易阅读。我首先从文件路径(前缀,数字)中提取需要排序的所有信息,然后将其放入一个临时数组(以及以后需要打开此路径的所有信息)。我按前缀和数字对该数组排序。我还用PSDCreate替换了app.open,因为问题在于按特定顺序打开文件,PSDCreate包含很多无关信息。

var filesArray = [],
    parsedFilesArray = [];

// Dialog for user to choose folder of documents to process
var inputFolderArray = [];

do {
    var inputFolder = Folder.selectDialog("Select a folder of documents to process");
    if (inputFolder != null)
    {
        inputFolderArray.push(inputFolder);
    }
}
while (inputFolder != null ||
    inputFolder != undefined)

// create an array of objects to sort it later based on files from InputFolder
for (var j = 0; j < inputFolderArray.length; j++)
{
    var filesList = inputFolderArray[j].getFiles();
    for (var i = 0; i < filesList.length; i++)
    {
        //extracting values for an object: [1] == path, [2] == name, [3] == number;
        var fileString = String(filesList[i]).match(/(.*)(?:\/)(.*?)\.(\d*)\.(.*)/);

        parsedFilesArray.push(
        {
            key: fileString[2], //filename
            num: fileString[3], //01
            path: fileString[1], // c/path/to/file/
            file: [fileString[2], fileString[3], "png"].join(".") // filename.01.png
        })
    }
}

//sorting the array
parsedFilesArray.sort(function(a, b)
{
    if (a.key === b.key)
    {
        return parseInt(a.num) - parseInt(b.num);
    }
    return a.key > b.key ? 1 : -1;
})

//opening files from the sorted array
for (var i = 0; i < parsedFilesArray.length; i++)
{
    app.open(new File(parsedFilesArray[i].path + "/" + parsedFilesArray[i].file))
}