#javascript #photoshop #photoshop-script
#javascript #photoshop #photoshop-скрипт
Вопрос:
Возможно ли сравнить имена файлов для набора файлов, которые импортируются как слои Photoshop? У меня есть папка с 50 изображениями jpg, которые я использовал в PSD-файле. Теперь я хочу проверить, используются ли все файлы JPG или нет? Возможно ли это сделать?
Комментарии:
1. Вы можете использовать
Folder(path).getFiles('*.jpg')
для получения всех файлов jpg, чем вы можете создать массив со всеми именами файлов без расширения, нажав. Затем вы можете использовать условие if для проверки, существует ли слой с определенным именем или нетapp.activeDocument.layers.getByName(i)
. Вот как это можно сделать с помощью сценариев Photoshop2. Я новичок в написании сценариев или программировании. Не могли бы вы помочь мне сделать один?
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 библиотека