Скрипт Photoshop, обрабатывающий изображения не по порядку

Я запускаю javascript с помощью инструмента/опции сценариев Photoshop для пакетной обработки папки изображений. Сценарий добавляет второй слой изображения из одного изображения в папке 02 к нескольким изображениям в папке 01. Это работает нормально, однако я пытаюсь уменьшить непрозрачность добавляемого слоя, чтобы добавленное изображение из папки 02 становится все более прозрачным для каждого последующего изображения, обработанного из папки 01. Я в основном создаю затухание, которое переходит от изображения в папке 02 к раскрытию изображений, обработанных из папки 01. Изменение непрозрачности происходит, как и ожидалось (уменьшение непрозрачности за каждое обработанное изображение); однако кажется, что они обрабатываются не по порядку, поэтому, когда я просматриваю изображения по порядку, непрозрачность этого добавленного слоя прыгает. Я также вижу, что когда только что обработанные изображения сохраняются в папку обработанных изображений, они поступают не по порядку (что-то вроде 1, 3, 2, 5, 6, 4; хотя каждый раз это может быть разным). Я подозреваю, что мне нужно заставить мой код обрабатывать изображения по одному по порядку, но я не уверен, как это сделать. Заранее спасибо! Я не считаю, что проблема заключается в именовании файлов, так как я пытался называть изображения в папке 01 как 1, 2, 3 (и т. д.), так и 01, 02, 03. Но это не помогает.

Заранее спасибо!

#target photoshop
// FOLDERS
var folder1 = new Folder('~/Desktop/1/');
var folder2 = new Folder('~/Desktop/2/');
var saveFolder = new Folder('~/Desktop/done/');
//
var searchMask = '*.???'; // get files named as this
var list1 = folder1.getFiles(searchMask);
var list2 = folder2.getFiles(searchMask);
var psdOptions = new PhotoshopSaveOptions();
psdOptions.layers = true;
opacityLevel = 100;


for (var i = 0; i < list1.length; i++) {
var doc = open(list1[i]);
var docName = doc.name;

placeFile('~/Desktop/2/1.jpg', 100); // for adding only one file each source file
doc.activeLayer.blendMode = BlendMode.LIGHTEN; // @@ change BLEND MODE

placeFile('~/Desktop/2/2.png', 100); // for adding only one file each source file
doc.activeLayer.blendMode = BlendMode.MULTIPLY; // @@ change BLEND MODE

doc.activeLayer.opacity = opacityLevel; // set layer opacity

// Decrement opacity level for each image
if (doc.activeLayer.opacity > 5) {  
    opacityLevel = Math.round(doc.activeLayer.opacity) - 5;
    } 

// SAVING
doc.saveAs(new File(saveFolder + '/' + docName.split('.')[0] + '.psd'), psdOptions);
doc.close(SaveOptions.DONOTSAVECHANGES);
};

function placeFile(file, scale) {
    try {
    var idPlc = charIDToTypeID("Plc ");
    var desc2 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    desc2.putPath(idnull, new File(file));
    var idFTcs = charIDToTypeID("FTcs");
    var idQCSt = charIDToTypeID("QCSt");
    var idQcsa = charIDToTypeID("Qcsa");
    desc2.putEnumerated(idFTcs, idQCSt, idQcsa);
    var idOfst = charIDToTypeID("Ofst");
    var desc3 = new ActionDescriptor();
    var idHrzn = charIDToTypeID("Hrzn");
    var idPxl = charIDToTypeID("#Pxl");
    desc3.putUnitDouble(idHrzn, idPxl, 0.000000);
    var idVrtc = charIDToTypeID("Vrtc");
    var idPxl = charIDToTypeID("#Pxl");
    desc3.putUnitDouble(idVrtc, idPxl, 0.000000);
    var idOfst = charIDToTypeID("Ofst");
    desc2.putObject(idOfst, idOfst, desc3);
    var idWdth = charIDToTypeID("Wdth");
    var idPrc = charIDToTypeID("#Prc");
    desc2.putUnitDouble(idWdth, idPrc, scale);
    var idHght = charIDToTypeID("Hght");
    var idPrc = charIDToTypeID("#Prc");
    desc2.putUnitDouble(idHght, idPrc, scale);
    var idAntA = charIDToTypeID("AntA");
    desc2.putBoolean(idAntA, true);
    executeAction(idPlc, desc2, DialogModes.NO);

    }
    catch (e) { }
}//end function placeFile  

person forestkelley    schedule 27.01.2019    source источник


Ответы (1)


Никогда не полагайтесь на функции списка файлов для поддержания логического порядка...

Попробуйте отсортировать списки файлов после их создания.

var list1 = folder1.getFiles(searchMask);
var list2 = folder2.getFiles(searchMask);
list1.sort();
list2.sort();

Убедитесь, что имена файлов сортируются ацибетически. Zerofix, если вы используете цифры.

В качестве альтернативы вы можете предоставить Array.sort() функцию сортировки, позволяющую выполнять пользовательскую сортировку. Узнайте больше о том, как это работает здесь.

person Powertieke    schedule 27.01.2019
comment
Это было фантастическое и удивительно простое решение! Большое спасибо. - person forestkelley; 27.01.2019