Как я могу сосредоточиться на другом документе с помощью Scripting JavaScript Photoshop?
-
30-09-2019 - |
Вопрос
Этот следующий скрипт почти делает то, что мне нужно. То, что я пытаюсь сделать, это пройти через открытые документы, 139 из них и спаси их как jpeg. Однако то, что он не хватает, переходит из одного открытого документа на другой, поэтому он сохранил одно и то же изображение более 139 раз. Я предположил doc.close()
Закроет открытый документ и дать новый фокус, но это не так.
Вот код:
var destination = "C:/Documents and Settings/Administrator/My Documents/small images"
for(var i = 0; i < 5; i++)
{
doc = documents[i];
name_ = doc.name.substring(0, doc.name.indexOf('.'))
saveForWebPNG(destination, name_);
doc.close();
}
function saveForWebPNG(outputFolderStr, filename)
{
var opts, file;
opts = new ExportOptionsSaveForWeb();
opts.format = SaveDocumentType.JPEG;
opts.quality = 60;
if (filename.length > 27) {
file = new File(outputFolderStr + "/temp.jpg");
activeDocument.exportDocument(file, ExportType.SAVEFORWEB, opts);
file.rename(filename + ".jpg");
}
else {
file = new File(outputFolderStr + "/" + filename + ".jpg");
activeDocument.exportDocument(file, ExportType.SAVEFORWEB, opts);
}
}
Решение
Согласно Adobe Photoshop CS2 JavaScript Руководство по сценарию Похоже, вам нужно назначить Application.activeDocument
Свойство, чтобы сделать этот документ, выбранный в данный момент один для любых действий. Это имеет смысл, поскольку вы используете это свойство в saveForWebPNG
Функция без явного активации документа в итераторе в первом блоке. Это может быть так же просто, как следующее изменение:
for (var i = 0; i < 5; i++) {
var doc = documents[i];
app.activeDocument = doc; // Select that document.
var name = doc.name.substring(0, doc.name.indexOf('.'))
saveForWebPNG(destination, name);
doc.close();
}
Однако у меня нет копии Photoshop и не проверила это решение.
Другие советы
Я знаю, что это очень поздно, но я просто наткнулся на этот вопрос и чувствую, что у меня может быть решение, которое кто-то в дороге может быть в состоянии использовать. Так вот идет.
Одно решение состоит в том, чтобы настроить цикл для цикла. Допустим, есть 5 документов открыты. app.documents.length будет 5. Когда вы закрываете одну, длина сейчас 4, то 3 и т. Д. Я рассчитываю как app.documents.length. Когда i = 3, app.documents.length = 2. Я думаю, что итерация назад будет делать трюк.
for (i = app.documents.length - 1; i >= 0; i--) { ... }
+1 для решения Джейба. Я не мог понять, почему мой цикл не будет завершен.
for (i=app.documents.length-1; i >= 0; i--) {
doc = app.documents[i];
app.activeDocument = doc;
...
do whatever you need, save & close
...
}
app.documents.length.length становится короче с каждой итерацией, хотя петля, если вы закрываете документ, когда вы закончите.
Вы хотите закрыть текущий выбранный (или активный) документ:
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);