Пропустить диалоговые окна в скрипте Photoshop? - PullRequest
1 голос
/ 12 февраля 2020

Я пытаюсь создать скрипт, который будет сохранять JPG из Photoshop в один клик. Он будет сохранен в том же каталоге с тем же именем файла, что и исходный файл PSD, только в формате JPG. В интернете я нашел скрипт, который делает то, что я хочу, на 90%, за исключением того, что он открывает два диалоговых окна - сначала спросить, хочу ли я переименовать файл, затем во втором диалоговом окне указать местоположение. В настоящее время я могу дважды нажать «Ввод», и это сработает, но я предпочитаю не иметь эти два диалоговых окна, во-первых (поэтому сценарий будет нажимать «Ввод» в этих полях для меня, надеюсь, даже не открывая эти поля , прямо под капотом).

Ниже приведен сценарий, который я сейчас имею. Я немного изменил его, чтобы он не сохранял PSD-файл, как это было изначально, только JPG. Не нужна часть Illustrator, так что не слишком переживайте по этому поводу.

    // ***** SaveTo.jsx Version 1.1. *****

    Changelog:

    v.1.1.
        - Fixed a weird issue where saving as jpg causes weird dialog stuff to happen if it's not saved as a copy. This started happening somewhere between PS CC 2017 and PS CC 2018.
        - Variable "pdfProfileAI" now has a failsafe where if the set profile doesn't exist, the first found profile is used instead. So what ever happens the pdf will be saved, but it might be using a wrong profile, but don't worry, the script will tell you if this happened and gives the name of the profile that was used. This failsafe would still fail if someone doesn't have any presets at all, but if that ever happens, he had it coming...
        - Added a new variable "listOfPresetsAI" so that you can easily get a list of preset so you can copy and paste the preset name to "pdfProfileAI";

var newDocPath = "~/Desktop/";
var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
var pdfProfileAI = "CMYK - Swop v2s";
var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.

var o = {};
var appName = app.name;
var pdfPresetNoMatch = false;

// If Photoshop
if ( appName === "Adobe Photoshop" ) {
    o.dialogTitle = "Save As: .jpg";
    o.formats = ['jpg'];
    o.app = 'ps';
}
// If Illustrator
else if ( appName === "Adobe Illustrator" ) {
    o.dialogTitle = "Save As: .ai and .pdf";
    o.formats = ['pdf','ai'];
    o.app = 'ai';
}

function dialog() {

    // Dialog
    var dlg = new Window("dialog");
    dlg.text = o.dialogTitle;

    var panel = dlg.add('panel');
    panel.alignChildren = ['left','center'];
    panel.orientation = 'row';

    var text1 = panel.add('statictext');
    text1.text = 'Filename: ';

    var text2 = panel.add('editText');
    text2.text = app.activeDocument.name.split('.')[0];
    text2.preferredSize = [530,23];
    text2.active = true;

    var button1 = panel.add('button', undefined, undefined, { name: 'cancel'});
    button1.text = "Cancel";

    var button2 = panel.add('button', undefined, undefined, { name: 'ok'});
    button2.text = "Save...";

    button2.onClick = function ( e ) {
        save.init( dlg, text2.text );
    };

    dlg.onShow = function () {
        dlg.location.x = dlg.location.x - dialogOffsetX;
        dlg.location.y = dialogOffsetY;
    }

    dlg.show();

}

var save = {
    init: function( dlg, dialog_filename ) {

        dlg.close();

        var doc = app.activeDocument;

        var doc_path;
        try {
            doc_path = doc.path.toString();
        } catch(e) {
            doc_path = newDocPath;
        }

        var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );

        if ( output_folder != null ) {
            for ( var i = 0; i < o.formats.length; i++ ) {
                var save_options = save[ o.formats[i] ]();

                if ( o.app === 'ps' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
                }
                else if ( o.app === 'ai' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
                }
            }
        }

    },
    ai: function() {

        var ai_options = new IllustratorSaveOptions();
        ai_options.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE;
        return ai_options;

    },
    pdf: function() {

        var pdf_Options = new PDFSaveOptions();
        pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
        return pdf_Options;

    },
    psd: function() {

        var psd_Options = new PhotoshopSaveOptions();
        return psd_Options;

    },
    jpg: function() {

        var jpg_Options = new JPEGSaveOptions();
        jpg_Options.embedColorProfile = true;
        jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
        // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
        jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
        jpg_Options.quality = 11; // 0-12
        return jpg_Options;

    }
};

function checkPresets( list, testPreset ) {

    var pdfPresets = app.PDFPresetsList;

    if ( list === true ) {
        alert( "\n" + pdfPresets.join('\n') );
    }
    else {
        var preset = null;
        for ( var i = pdfPresets.length; i--; ) {
            if ( pdfPresets[i] === testPreset ) {
                preset = testPreset;
            }
        }
        pdfPresetNoMatch = (preset === null);
        return (pdfPresetNoMatch ? pdfPresets[0] : preset);
    }

}

if ( listOfPresetsAI === true ) {
    checkPresets( true );
}
else if ( app.documents.length > 0 ) {

    dialog();
    if ( pdfPresetNoMatch ) alert( "Couldn't use your PDF preset!!! \n Used " + app.PDFPresetsList[0] + " instead." );

}

Любая помощь очень ценится. У меня есть базовые c навыки кодирования, но я никогда не работал со сценариями Photoshop.

Спасибо за потраченное время.

Алексей. В

Ответы [ 4 ]

0 голосов
/ 08 апреля 2020

Если вы просто хотите сохранить в формате jpeg (в новом месте) или в том месте, где находился исходный файл, вам просто нужно что-то простое, например:

Нет прерываний диалога!

// Switch off any dialog boxes
displayDialogs = DialogModes.NO; // OFF

//pref pixels
app.preferences.rulerUnits = Units.PIXELS;

var newDocPath = "~/Desktop/";

// jpeg quality
var jq = 11;

// call the source document
var srcDoc = app.activeDocument;

var fileName = app.activeDocument.name;
// remove the extension (assuming it's .xxx)
var docName = fileName.substring(0,fileName.length -4);

// uncomment this for placing the jpeg in the source path
//var filePath = srcDoc.path + "\\" + docName + ".jpg";

// save jpeg at the location of newDocPath
var filePath = newDocPath + "\\" + docName + ".jpg";

// Flatten the psd
flatten_it();

// Save it out as jpeg
jpegIt(filePath, jq);

// Close it 
app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

// Set Display Dialogs back to normal
displayDialogs = DialogModes.ALL; // NORMAL



// function FLATTEN IT ()
// ----------------------------------------------------------------
function flatten_it()
{
  activeDocument.flatten();
}



// function JPEG IT (file path + file name, quality)
// ----------------------------------------------------------------
function jpegIt(filePath, jpgQuality)
{
  if(! jpgQuality) jpgQuality = 12;


  // jpg file options
  var jpgFile = new File(filePath);
  jpgSaveOptions = new JPEGSaveOptions();
  jpgSaveOptions.formatOptions = FormatOptions.OPTIMIZEDBASELINE;
  jpgSaveOptions.embedColorProfile = true;
  jpgSaveOptions.matte = MatteType.NONE;
  jpgSaveOptions.quality = jpgQuality;

  activeDocument.saveAs(jpgFile, jpgSaveOptions, true, Extension.LOWERCASE);
}
0 голосов
/ 13 февраля 2020

Если у вас установлена ​​магия изображения, вы можете просто сделать однострочный скрипт оболочки

$ convert [psd здесь передается в качестве аргумента] .psd covert [psdname] .jpg

That должен сделать это.

0 голосов
/ 13 февраля 2020

Я вставил код Grumpy, но теперь получаю сообщение об ошибке 23: не имеет значения. Строка 64 ->},

Вот код с новым вставленным кодом:

var newDocPath = "~/Desktop/";
var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
var pdfProfileAI = "CMYK - Swop v2s";
var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.

var o = {};
var appName = app.name;
var pdfPresetNoMatch = false;

// If Photoshop
if ( appName === "Adobe Photoshop" ) {
    o.dialogTitle = "Save As: .jpg";
    o.formats = ['jpg'];
    o.app = 'ps';
}
// If Illustrator
else if ( appName === "Adobe Illustrator" ) {
    o.dialogTitle = "Save As: .ai and .pdf";
    o.formats = ['pdf','ai'];
    o.app = 'ai';
}

function dialog() {
            var doc = app.activeDocument;

            var doc_path;


try {
            doc_path = doc.path.toString();
        } catch(e) {
            doc_path = newDocPath;
        }

        var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );

        if ( output_folder != null ) {
            for ( var i = 0; i < o.formats.length; i++ ) {
                var save_options = save[ o.formats[i] ]();

                if ( o.app === 'ps' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
                }
                else if ( o.app === 'ai' ) {
                    doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
                }
            }
        }

    },
    ai: function() {

        var ai_options = new IllustratorSaveOptions();
        ai_options.flattenOutput = OutputFlattening.PRESERVEAPPEARANCE;
        return ai_options;

    },
    pdf: function() {

        var pdf_Options = new PDFSaveOptions();
        pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
        return pdf_Options;

    },
    psd: function() {

        var psd_Options = new PhotoshopSaveOptions();
        return psd_Options;

    },
    jpg: function() {

        var jpg_Options = new JPEGSaveOptions();
        jpg_Options.embedColorProfile = true;
        jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
        // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
        jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
        jpg_Options.quality = 11; // 0-12
        return jpg_Options;

    }
};
function checkPresets( list, testPreset ) {

    var pdfPresets = app.PDFPresetsList;

    if ( list === true ) {
        alert( "\n" + pdfPresets.join('\n') );
    }
    else {
        var preset = null;
        for ( var i = pdfPresets.length; i--; ) {
            if ( pdfPresets[i] === testPreset ) {
                preset = testPreset;
            }
        }
        pdfPresetNoMatch = (preset === null);
        return (pdfPresetNoMatch ? pdfPresets[0] : preset);
    }

}

if ( listOfPresetsAI === true ) {
    checkPresets( true );
}
else if ( app.documents.length > 0 ) {

    dialog();
    if ( pdfPresetNoMatch ) alert( "Couldn't use your PDF preset!!! \n Used " + app.PDFPresetsList[0] + " instead." );

}

Что мне здесь не хватает? это похоже на техническую проблему, о которой я не знаю.

Еще раз спасибо!

Алексей. В

0 голосов
/ 13 февраля 2020

Попробуйте, возможно, вам придется немного пощипать, но при этом пропускается вся диалоговая часть.

var newDocPath = "~/Desktop/";
var listOfPresetsAI = false; // When set to true the script won't save anything but instead gives you a list of pdf preset names.
var pdfProfileAI = "CMYK - Swop v2s";
var dialogOffsetX = 250; // Subtracts from the center of the screen = Center of the screen horizontally - 250px.
var dialogOffsetY = 200; // Just a static value = 200px from the top of the screen.

var o = {};
var appName = app.name;
var pdfPresetNoMatch = false;

// If Photoshop
if ( appName === "Adobe Photoshop" ) {
    dialog('jog');
}
// If Illustrator
else if ( appName === "Adobe Illustrator" ) {
    dialog('pdf');
}

function dialog(what) {
    var doc = app.activeDocument;

    var doc_path;


    try {
        doc_path = doc.path.toString();
    } catch(e) {
        doc_path = newDocPath;
    }

    var output_folder = Folder.selectDialog( 'Output folder', doc_path === "" ? newDocPath : doc_path );

    if ( output_folder != null ) {
        for ( var i = 0; i < o.formats.length; i++ ) {
            var save_options = save[ o.formats[i] ]();

            if ( o.app === 'ps' ) {
                doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options, ( o.formats[i] === 'jpg' ? true : false ), Extension.LOWERCASE );
            }
            else if ( o.app === 'ai' ) {
                doc.saveAs( new File( output_folder + '/' + dialog_filename ), save_options );
            }
        }
    }
    if(what=='jpg') {
        var jpg_Options = new JPEGSaveOptions();
        jpg_Options.embedColorProfile = true;
        jpg_Options.FormatOptions = FormatOptions.OPTIMIZEDBASELINE; // OPTIMIZEDBASELINE, PROGRESSIVE, STANDARDBASELINE
        // jpg_Options.scans = 5; // For FormatOptions.PROGRESSIVE
        jpg_Options.matte = MatteType.WHITE; // BACKGROUND, BLACK, FOREGROUND, NETSCAPE, NONE, SEMIGRAY, WHITE
        jpg_Options.quality = 11; // 0-12
        return jpg_Options;
    }

    if(what=='pdf'){
        var pdf_Options = new PDFSaveOptions();
        pdf_Options.pDFPreset = checkPresets( false, pdfProfileAI );
        return pdf_Options;        
    }
};
function checkPresets( list, testPreset ) {

    var pdfPresets = app.PDFPresetsList;

    if ( list === true ) {
        alert( "\n" + pdfPresets.join('\n') );
    }
    else {
        var preset = null;
        for ( var i = pdfPresets.length; i--; ) {
            if ( pdfPresets[i] === testPreset ) {
                preset = testPreset;
            }
        }
        pdfPresetNoMatch = (preset === null);
        return (pdfPresetNoMatch ? pdfPresets[0] : preset);
    }

}

if ( listOfPresetsAI === true ) {
    checkPresets( true );
}
else if ( app.documents.length > 0 ) {

alert( "Couldn't use your PDF preset!!! \n Used " + app.PDFPresetsList[0] + " instead." );

}
...