Сравнение файлов JPG со слоями Photoshop

#javascript #photoshop #photoshop-script

#javascript #photoshop #photoshop-скрипт

Вопрос:

Возможно ли сравнить имена файлов для набора файлов, которые импортируются как слои Photoshop? У меня есть папка с 50 изображениями jpg, которые я использовал в PSD-файле. Теперь я хочу проверить, используются ли все файлы JPG или нет? Возможно ли это сделать?

Комментарии:

1. Вы можете использовать Folder(path).getFiles('*.jpg') для получения всех файлов jpg, чем вы можете создать массив со всеми именами файлов без расширения, нажав. Затем вы можете использовать условие if для проверки, существует ли слой с определенным именем или нет app.activeDocument.layers.getByName(i) . Вот как это можно сделать с помощью сценариев Photoshop

2. Я новичок в написании сценариев или программировании. Не могли бы вы помочь мне сделать один?

3. Я могу помочь, но мне нужно точно знать, что вы пытаетесь сделать. Я имею в виду, какой тип структуры слоев существует в psd. лучше поделитесь изображением, содержащим ваши слои, и вашей проблемой, чтобы я мог создать рабочий скрипт.

4. Спасибо, мистер Онлайн, хорошо. Это сценарий: у меня есть папка, содержащая 100 изображений. Я создал дизайн, в котором использовал все 100 изображений. Но я не уверен, использовал ли я все 100 изображений или нет (на изображении дизайна). Итак, мне нужен скрипт, который сравнивал бы 100 изображений в папке со 100 слоями в файле PSB, который я создал. Если в изображении PSB отсутствует какое-либо изображение, оно должно уведомить об этом изображении. Правило таково, что в дизайне должны использоваться все 100 изображений. PS: Изображения не будут дублироваться в изображении PSB, они будут использованы один раз. Можно ли это сделать?

5. Также структура слоя может быть случайной. Единственное, что беспокоит, используются ли эти 100 изображений в файле или нет.

Ответ №1:

Как я уже говорил, сценарии Photoshop могут помочь вам достичь этого, используя файловые объекты и базовые знания javascript. Я изменил свой старый скрипт по вашему желанию, и теперь он должен хорошо работать с любыми вложенными группами и изображениями.

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

Сохраните приведенный ниже код как ‘Script.jsx’ и запустите его из ‘File> Scripts> Browse’

Обновление 2: теперь он сохраняет log.txt файл тоже в соответствии с вашим запросом. P.S. Извлеките уроки из этого скрипта и настройте его под желаемый результат.

 // Managing Document
var docs = app.documents;

// Progress Bar
var win = new Window("window{text:'Progress',bounds:[100,100,400,150],bar:Progressbar{bounds:[20,20,280,31] , value:0,maxvalue:100}};");

// assigning activeDocument
if (docs.length != 0) {
    var docRef = app.activeDocument;

    // Defining the folder
    alert("You will be prompted for the folder containing your images.n"  
        "Files will be selected with a '.png'/'.jpg/.jpeg' on the end in the same folder.");
    var folder = Folder.selectDialog();
    if (!folder) {
        exit;
    }

    var photoFiles = folder.getFiles(/.(jpg|jpeg|png)$/i);
    var matchFiles = [];
    var photoFilesName = [];
    //Searching for used images
    var increment = parseFloat(0);
    var divider = parseFloat(100/photoFiles.length);
    win.show();
    for (var i = 0; i < photoFiles.length; i  ) {
        increment = increment   divider;
        var indexPhotoName = removeExtension(photoFiles[i].displayName);
        photoFilesName.push(indexPhotoName);
        var doc = activeDocument;
        var curLayer;
        goThroughLayers(doc, indexPhotoName);
    }

    function goThroughLayers(parentLayer, targetName) {
        for (var i = 0; i < parentLayer.layers.length; i  ) {
            curLayer = parentLayer.layers[i];
            doc.activeLayer = curLayer;
            if (curLayer.typename == 'LayerSet') {
                goThroughLayers(curLayer, targetName)
            } else {
                if (curLayer.name == targetName) {
                    // if (curLayer.name.match(/[e]/ig)) {
                        matchFiles.push(targetName);
                    // }
                } //end if
            } //end else
        } //end loop
    } //end function


    function arr_diff(a1, a2) {
        var a = [],
            diff = [];
        for (var i = 0; i < a1.length; i  ) {
            a[a1[i]] = true;
        }
        for (var i = 0; i < a2.length; i  ) {
            if (a[a2[i]]) {
                delete a[a2[i]];
            } else {
                a[a2[i]] = true;
            }
        }
        for (var k in a) {
            diff.push(k);
        }
        return diff;
    }

    function removeExtension(str) {
        return str.split('.').slice(0, -1).join('.');
    }

    var missItems = arr_diff(matchFiles, photoFilesName);
    if (missItems.length > 0) {
        var missFolder = new Folder(photoFiles[0].path   '/Missed Files');
        if(!missFolder.exists){
            missFolder.create();
        }
        for (var y = 0; y < photoFiles.length; y  ) {
            var photoTrimName = removeExtension(photoFiles[y].displayName);
            for( var x = 0; x < missItems.length ; x  ){
                if(photoTrimName == missItems[x]){
                    photoFiles[y].copy(new File(missFolder '/' photoFiles[y].displayName));
                }
            }
        };
        win.close();
        alert("You've missed total "   missItems.length   " files. Press OK to open folder containing missing files. Log report is generated wherever PSD is saved.");
        var FileStr = "";
        for(var m=0; m<missItems.length; m  ){
            FileStr = FileStr   'n'   (m 1)   '. '   missItems[m];
        }
        var str = "Your missed files are : "   FileStr;
        saveTxt(str);
        missFolder.execute();
    } else {
        win.close();
        saveTxt('All Photos are used');
        alert('All Photos are used');
    }
} else {
    alert('Open atleast one document');
}

function saveTxt(txt)
{
    var Name = "LogReport_"   app.activeDocument.name.replace(/.[^.] $/, '');
    var Ext = decodeURI(app.activeDocument.name).replace(/^.*./,'');
    if (Ext.toLowerCase() != 'psd')
        return;

    var Path = app.activeDocument.path;
    var saveFile = File(Path   "/"   Name  ".txt");

    if(saveFile.exists)
        saveFile.remove();

    saveFile.encoding = "UTF8";
    saveFile.open("e", "TEXT", "????");
    saveFile.writeln(txt);
    saveFile.close();
}
 

Комментарии:

1. У меня было мало времени, поэтому сценарий очень грубый. надеюсь, это поможет

2. Спасибо за это, мистер Онлайн. Я проверил это, но он показывает ошибку, хотя использовались все файлы PNG. Как я могу отправить вам скриншот ошибки?

3. Вы можете загрузить его на сайт временного хранения изображений, а затем опубликовать ссылку в комментарии. Как я уже сказал, это очень простой и может возникнуть ошибка. Я могу настроить его как безошибочный, но у меня очень плотный график на 2 дня

4. Вы также можете связаться со мной по электронной почте, вы можете увидеть это в моем профиле, но я не думаю, что смогу исправить это за 2 дня

5. Подождите. Я только что обнаружил, что вы хотите jpg вместо png. Я обновляю свой ответ. Пожалуйста, повторно сохраните код и попробуйте запустить

Ответ №2:

В Javascript можно получить некоторую информацию, связанную со слоями PSD-файлов, используя PSD.js библиотека