如何制作log.csv文件以在一行中记录400个.jpeg名称(Photoshop / JavaScript)

时间:2018-07-26 20:13:40

标签: javascript csv logging photoshop photoshop-script

我还是JavaScript新手。但是以某种方式设法创建了以下脚本。通常,我运行此脚本以批处理400-500张图像。它会在进行某些特定的图像压缩的同时,在2个不同的位置创建并保存2张图像副本。

//Script should be used only in Adobe Photoshop
//This script will:  1. Check if canvas is 1:1, if not then scale to the correct ratio (3000px x 3000px) 
//                   2. Check whether it has ColorProfile embedded. If not then change collor profile to sRGB.
//                   3. Save the resized TIFF version (100% Quality, 3000px x 3000px, sRGB, LZW compressed, Without layers) into "/Volumes/Hams Hall Workspace/Ecom_Staging/Images_Today"
//                   4. Save another copy as JPEG (80% Quality, 2000px x 2000px, sRGB) "into /Volumes/Hams Hall Workspace/Ecom_Staging/Jpegs_for_Hybris"

if( BridgeTalk.appName == "photoshop" ) {

//continue executing script
}

// create the output file
// first figure out which kind of line feeds we need
    if ($.os.search(/windows/i) != -1) {
    fileLineFeed = "Windows"
    } 
    else {
    fileLineFeed = "Macintosh"
    }

//output location
folderHybrisUpload = "/Jpegs_for_Hybris";
folderTiffSave = "/Images_Today";
folderDumpRoot = "/Volumes/Hams Hall Workspace/Ecom_Staging";
folderName = "~/Desktop/"


// Sizes
var hybrisSize=2000;
var hybrisQuality=80;
var docRef = activeDocument;



//History States
app.purge(PurgeTarget.HISTORYCACHES);
var history = docRef.historyStates.length - 1;

//Units Pixels
app.preferences.rulerUnits = Units.PIXELS;

//Make it 1:1 Ratio (Square)
if (docRef.height != docRef.width) {

        docRef.changeMode(ChangeMode.RGB);
        // these are our values for the END RESULT width and height (in pixels) of our image
        var fWidth = 3000;
        var fHeight = 3000;

        // do the resizing.  if height > width (portrait-mode) resize based on height.  otherwise, resize based on width
        if (docRef.height > docRef.width) {
            docRef.resizeImage(null, UnitValue(fHeight, "px"), null, ResampleMethod.BICUBIC);
        } else {
            docRef.resizeImage(UnitValue(fWidth, "px"), null, null, ResampleMethod.BICUBIC);
        }
        // Makes background white
        var white = new SolidColor();
        white.rgb.hexValue = "FFFFFF";
        app.backgroundColor = white;

        // Resize Canvas 
        app.activeDocument.resizeCanvas(UnitValue(fWidth, "px"), UnitValue(fHeight, "px"));
        var history = docRef.historyStates.length - 1;
    }

//Correct .jpeg extension when saving for Hybris 
    
    var fileNameNoExtension = docRef.name;
    fileNameNoExtension = fileNameNoExtension.split(".");
    var fileExtension= fileNameNoExtension[1];

    if (fileNameNoExtension.length > 1) {
       fileNameNoExtension.length--;
    }

    fileNameNoExtension = fileNameNoExtension.join(".");

    fileNameType = fileNameNoExtension.split("_");

    var finalUnderScorePosition = fileNameNoExtension.lastIndexOf("_");

    varFileName = "";
    for (var a = 0; a < finalUnderScorePosition; a++) {
               varFileName += fileNameNoExtension.charAt(a)
           }

    varFileType = "";
    for (var a = finalUnderScorePosition + 1; a < fileNameNoExtension.length; a++) {
        varFileType += fileNameNoExtension.charAt(a)
    }


//Save File into Hybris Folder
         app.activeDocument.resizeImage(hybrisSize, undefined, undefined, ResampleMethod.BICUBICSHARPER);
         saveFile = File(folderDumpRoot + folderHybrisUpload + "/" + varFileName + "_"+varFileType+".jpg")
         SaveJPEG(hybrisQuality,saveFile);

         docRef.activeHistoryState = docRef.historyStates[history];

//Save copy of an "Original" into Tiff Folder (Images_Today)
         app.activeDocument.save();
         var saveTIFF = new TiffSaveOptions();
         saveTIFF.layers = false;
         saveTIFF.imageCompression = TIFFEncoding.TIFFLZW;
         app.activeDocument.saveAs(new File(folderDumpRoot + folderTiffSave + "/" + docRef.name), saveTIFF);

//JPEG Compression Settings
    function SaveJPEG(quality,saveFile) {
         var exportOptionsSaveForWeb = new ExportOptionsSaveForWeb();
         exportOptionsSaveForWeb.format = SaveDocumentType.JPEG;
         exportOptionsSaveForWeb.includeProfile = false;
         exportOptionsSaveForWeb.interlaced = true;
         exportOptionsSaveForWeb.optimized = true;
         exportOptionsSaveForWeb.includeProfile = false;
         exportOptionsSaveForWeb.quality = quality;
         activeDocument.exportDocument(saveFile, ExportType.SAVEFORWEB, exportOptionsSaveForWeb);
    }
         

// Create the log file
var fileOut = new File(folderName+"time_test.txt");

// Use OS specific linefeeds
fileOut.lineFeed = fileLineFeed;

// open the file for writing
fileOut.open("w", "TEXT", "????");

// Write a line to .log file
// use commas as delimiters if you want to open the file in Excel
// use "/r" to add carriage returns
fileOut.writeln("SKU, Date");

// Write another line to .log file
// var TodaysDate = new Date();
fileOut.write(varFileName + "_"+varFileType+".jpg\r");

// stop writing to the file
fileOut.close();


// Open the file in it's associated application
// .log files are associated with the "Console" on OS X
fileOut.execute();

//Close
         app.activeDocument.close();

接下来,我要记录已成功保存在一行中的“ / Volumes / Hams Hall Workspace / Ecom_Staging / Jpegs_for_Hybris”中并保存在桌面。

我设法创建了.csv日志文件,该文件将图像名称(“ SKU”)记录到桌面上的该.csv文件中。

// Create the log file
var fileOut = new File(folderName+"time_test.txt");

// open the file for writing
fileOut.open("w", "TEXT", "????");

// Write a line to .log file
// use commas as delimiters if you want to open the file in Excel
// use "/r" to add carriage returns
fileOut.writeln("SKU, Date");

// Write another line to .log file
// var TodaysDate = new Date();
fileOut.write(varFileName + "_"+varFileType+".jpg\r");

// stop writing to the file
fileOut.close();


// Open the file in it's associated application
// .log files are associated with the "Console" on OS X
fileOut.execute();

但是问题在于,脚本处理的每个新图像都只是重新创建相同的.csv文件。 .csv文件中显示的只是图像名称的一行。

我尝试过在线搜索一些答案,但是给出的唯一答案是如何创建基本日志文件。或来自多个不同名称的图层的日志文件。

我还尝试创建一些条件,如果已经创建了日志,请不要创建新的条件,而要使用现有的并简单地使用writeln(filename)或“ \ r” + filename \ r。但它只是忽略它,并继续创建新文件。

任何建议将不胜感激。

Problem with the current log.csv that it shows only 1 line of image name

1 个答案:

答案 0 :(得分:1)

用以下内容代替脚本的最后部分(即您写入文本文件的部分):

// Create the log file
var fileOut = new File(folderName+"time_test.txt");

// Check if the file already exists.
if (!fileOut.exists) {
  fileOut.open("w");
  fileOut.writeln("SKU, Date");
  fileOut.writeln(varFileName + "_"+varFileType+".jpg");
} else {
  fileOut.open("a");
  fileOut.writeln(varFileName + "_"+varFileType+".jpg");
}

// stop writing to the file
fileOut.close();

// Open the file in it's associated application
// .log files are associated with the "Console" on OS X
fileOut.execute();

说明

  1. 您需要首先通过以下行检查.txt文件是否已存在:

    if (!fileOut.exists) { ... }
    

    这只是检查.txt文件是否不存在。

    注意:!开头-表示对文件是否存在的检查是否返回false

  2. 首次运行脚本时,检查将返回false,并使用.txt参数打开"w"文件-这表示 write

    这次,我们在第一行中写头文件SKUDate,在第二行中写上处理的第一个文件的名称。

  3. 再次运行脚本时,

    if (!fileOut.exists) { ... }
    

    check返回true,因为该文件已经存在。这次使用.txt参数打开了"a"文件(这表示 append ),并且处理的文件名写在新行的末尾。文件。

注释

  • .txt文件通常与 TextEdit 应用程序相关联。 TextEdit 在打开文件时不会动态显示对文件内容的任何更新。您可能会发现需要关闭.txt文件,然后再次打开以查看添加到文件内容中的最新文件名。
  • 上面的示例使用writeln而不是write,因此结尾的\r不是必需的。