Javascript Импорт изображений в Photoshop в алфавитном и числовом порядке - PullRequest
0 голосов
/ 28 января 2019

Это 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 .. и т. д.

Скрипт отлично работает до конца.Всегда не удается ввести одно из изображений из последнего числового набора.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 ... т. д.

Тот, который я использую, помещает в порядке

a.001.png, b.001.png, c.001.png, a.002.png, b.002.png, c.002png ... и т. Д.

У меня есть a,b, c изображения, заканчивающиеся на .001, импортированные в Photoshop.Затем в этот момент код, который я вынул, затем складывает изображения в порядке (a, b, c) и выполняет различные другие задачи.Когда закончите, сохраните их как PSD-файл "name.001.psd".Затем скрипт вводит следующую группу изображений с 002 и повторяет процесс в цикле.Это часть, которую я удалил, потому что в ней так много кода, и, похоже, проблема не в этом.Можно ли получить изображения, введенные как

a, b, c .001, затем a, b, c .002..etc?

Код:

#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 голосов
/ 29 января 2019

Я не смог понять, почему вы потеряли один из элементов массива: ваша сортировка меня озадачила, поэтому я переписал сортировку, я думаю, что ее немного легче читать.Сначала я извлекаю всю информацию, необходимую для сортировки, из пути к файлу (префикс, номер) и помещаю ее во временный массив (вместе со всем, что мне нужно, чтобы открыть этот путь позже).Я сортирую этот массив по префиксу и номеру.Также я заменил 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))
}
...