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

标签 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 文件中桌面。

我设法创建了 .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

最佳答案

将脚本的最后部分(即写入文本文件的部分)替换为以下内容:

// 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 并使用 "w" 打开 .txt 文件> 参数 - 这意味着

    这次我们在第一行写标题SKU日期,在第二行写第一个处理的文件的名称。

    <
  3. 当脚本再次运行时

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

    check 返回 true 因为文件已经存在。这次使用 “a” 参数打开 .txt 文件(这意味着 append),处理的文件的名称是写在新的一行作为文件的结尾。

注意事项

  • .txt 文件通常与 TextEdit 应用程序关联。 TextEdit 不会在文件打开时动态显示对文件内容所做的任何更新。您可能会发现需要关闭 .txt 文件并再次打开它才能看到添加到文件内容中的最新文件名。
  • 上面的例子使用了writeln而不是write,所以尾随的\r并不是没有必要的。

关于javascript - 如何制作 log.csv 文件以在一行中记录 400 个 .jpeg 名称 (Photoshop/JavaScript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546831/

相关文章:

java - 根据文件大小和时间回滚日志

java - 了解异步记录器中的环形缓冲区

logging - 如何使用 newsyslog 将日期添加到日志文件名中?

javascript - 如何使用构造函数自动调用方法

javascript - 我可以在浏览器/node.js 上使用不同的库,而不必编辑 package.json 吗?

csv - 我可以将 tensorflow 摘要导出为 CSV 吗?

python - Pandas:读取 csv 和旋转数据

Python - 将包含 IP 地址和不同数据的文本文件的列表转换为 CSV

javascript - 如果 Handlebars 中数据丢失,如何删除模板标记?

javascript - 返回 JS 对象而不是数组的 php 脚本