Как я могу сосредоточиться на другом документе с помощью Scripting JavaScript Photoshop?

StackOverflow https://stackoverflow.com/questions/3122863

Вопрос

Этот следующий скрипт почти делает то, что мне нужно. То, что я пытаюсь сделать, это пройти через открытые документы, 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top