1

我正在尝试创建一个脚本,可以一键从 Photoshop 中保存 JPG。它将以与原始 PSD 文件相同的文件名保存在同一目录中,只是 JPG 格式。我在网上找到了一个脚本,它可以完成我想要的 90%,除了它打开两个对话框 - 第一个询问我是否要重命名文件,然后第二个对话框指定位置。目前我可以按两次“Enter”,它会起作用,但我宁愿首先没有这两个对话框(所以脚本会为我在这些框上按“Enter”,希望甚至不需要打开这些框,就在引擎盖下)。

以下是我现在拥有的脚本。我稍微修改了一下,所以它不会像原来那样保存 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." );

}

任何帮助深表感谢。我有基本的编码技能,但从未使用过 Photoshop 脚本。

感谢您的时间。

阿列克谢。乙

4

4 回答 4

0

如果您只想保存为 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);
}
于 2020-04-08T07:03:01.657 回答
0

试试这个,你可能需要多刺痛一点,但它会跳过整个对话部分。

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." );

}
于 2020-02-12T21:03:14.403 回答
0

如果你安装了 image magick,你可以简单地做一个单行 shell 脚本

$convert [psd 这里作为参数传入].psd 隐蔽 [psdname].jpg

那应该这样做。

于 2020-02-12T22:10:01.267 回答
0

我粘贴了 Grumpy 的代码,但现在得到 Error 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." );

}

我在这里想念什么?这感觉像是一个我不知道的技术问题。

再次感谢!

阿列克谢。乙

于 2020-02-12T22:16:34.007 回答