Decent
Decent

Reputation: 9

Why will Photoshop Batch files not compress

I am attempting to resize and compress a batch file is Photoshop. It does everything else, resize, create folders, and save. But it does not appear to be compressing the images. Any idea why this would be? I have tried many variations of this, I did use Google and LLMs. The only difference I get is complete failure. As said, this will almost work, it just will not compress the images.



// variables
var inputFolder = Folder.selectDialog("SELECT A FOLDER OF IMAGES TO RESIZE");
var outputFolder = inputFolder

// check that the folder has files in it
if (inputFolder != null) {
    var fileList = inputFolder.getFiles(/.+\.(?:gif|jpe?g|[ew]mf|eps|tiff?|psd|pdf|bmp|png)$/i);
} else {
    alert("Couldn't find any files. Check your directory path and try again.");
    Exit();
}

// set background color
var BGcolor = new SolidColor();  
BGcolor.rgb.red = 255;  
BGcolor.rgb.green = 255;  
BGcolor.rgb.blue = 255;  
    
// set your color as background color  
backgroundColor.rgb.hexValue = BGcolor.rgb.hexValue;  

//  new image sizes
var large = 900;
var normal = 600;
var thumbnail = 300;

//  new image name extentions
var largeNameExt = '_l';
var normalNameExt = '_n';
var thumbnailNameExt = '_t';

// set jpeg save options
var jpegSaveOptions = new JPEGSaveOptions();
jpegSaveOptions.embedColorProfile = true;
jpegSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;
jpegSaveOptions.matte = MatteType.NONE;
jpegSaveOptions.quality = 12;

// error logging
var errors = [];

/* 
Function: createFolder
Description: creates the new folders for export 
imageSize: the new image size used to create the folder path
*/
function createFolders(imageSize) {
    var addFolder = new Folder(outputFolder + '/' + imageSize.toString() + 'px' + '/');
    addFolder.create();
} // createFolders


// Set jpeg save options with quality adjustments
function setJPEGQuality(saveOptions, targetSizeKB) {
    var quality = 12; // Start with maximum quality
    var tempFile = new File("~/Desktop/temp.jpg");
    
    do {
        saveOptions.quality = quality;
        doc.saveAs(tempFile, saveOptions, true, Extension.LOWERCASE);
        var fileSize = tempFile.length / 1024; // Convert bytes to KB

        if (fileSize > targetSizeKB) {
            quality -= 1; // Reduce quality to decrease file size
        } else {
            break; // Exit the loop if target size is met
        }
    } while (quality > 0);

    tempFile.remove(); // Clean up the temp file
}

// CreateImages function
function createImages() {
    // add new folder paths
    createFolders(large);
    createFolders(normal);
    createFolders(thumbnail);

    // trim the images then resize
    for (var i = 0; i < fileList.length; i++) {
        // open the image
        try {
            var doc = app.open(fileList[i]);
            // set the output locations and names
            var fileName = fileList[i].name.replace(/\.(?:gif|jpe?g|[ew]mf|eps|tiff?|psd|pdf|bmp|png)$/, '');
            var saveImgLarge = new File(outputFolder + "/" + large.toString() + 'px' + '/' + fileName + largeNameExt + '.jpg');
            var saveImgNormal = new File(outputFolder + "/" + normal.toString() + 'px' + '/' + fileName + normalNameExt + '.jpg');
            var saveImgThumbnail = new File(outputFolder + "/" + thumbnail.toString() + 'px' + '/' + fileName + thumbnailNameExt + '.jpg');

            // trim whitespace
            doc.trim();

            // Resize and save images
            // Large
            if (doc.height > doc.width) {
                doc.resizeImage(null, UnitValue(large, "px"), 72, ResampleMethod.BICUBICAUTOMATIC);
            } else {
                doc.resizeImage(UnitValue(large, "px"), null, 72, ResampleMethod.BICUBICAUTOMATIC);
            }
            doc.resizeCanvas(large, large, AnchorPosition.MIDDLECENTER);
            setJPEGQuality(jpegSaveOptions, 70); // Adjust quality to target size 70 KB
            doc.saveAs(saveImgLarge, jpegSaveOptions, true, Extension.LOWERCASE);

            // Normal
            doc.resizeImage(UnitValue(normal, "px"), UnitValue(normal, "px"), 72, ResampleMethod.BICUBICAUTOMATIC);
            setJPEGQuality(jpegSaveOptions, 50); // Adjust quality to target size 50 KB
            doc.saveAs(saveImgNormal, jpegSaveOptions, true, Extension.LOWERCASE);

            // Thumbnail
            doc.resizeImage(UnitValue(thumbnail, "px"), UnitValue(thumbnail, "px"), 72, ResampleMethod.BICUBICAUTOMATIC);
            setJPEGQuality(jpegSaveOptions, 20); // Adjust quality to target size 20 KB
            doc.saveAs(saveImgThumbnail, jpegSaveOptions, true, Extension.LOWERCASE);

            doc.close(SaveOptions.DONOTSAVECHANGES);
        } catch (err) {
            errors.push(fileList[i].name);
        }
    }
}


createImages();

if (errors.length > 0) {
    alert("Oops! We ran into some errors.\nWhile the program did run successfully, you will still need to double-check the files listed below for issues like these:" + "\n\n1) Files are corrupt (files don't open, or cause an error when you try to open them)\n2) Files have unusual characters in their file names\n3) Files are not one of these types of image files:\ngif, jpeg, jpg, eps, tiff, tif, psd, pdf, bmp, png" + "\n\n*** FILE ERRORS ***\n" + errors.join("\n"));
} else {
    alert("Task Completed!");
}

I tried the above code (any many variations). I am expecting it to resize and compress images.

Upvotes: -3

Views: 47

Answers (1)

Ghoul Fool
Ghoul Fool

Reputation: 6967

I don't know why this was down voted.

I suspect your script isn't working as the file saved isn't being properly released. I've adjusted the loop to save out iterative versions and you can see for yourself:

// Set jpeg save options with quality adjustments
function setJPEGQuality(saveOptions, targetSizeKB) 
{
    var quality = 12; // Start with maximum quality
    //var tempFile = new File("~/Desktop/temp.jpg");
    
    do {
        saveOptions.quality = quality;
        var f = "~/Desktop/temp_" + quality + ".jpg";
        var tempFile = new File(f);
        doc.saveAs(tempFile, saveOptions, true, Extension.LOWERCASE);

        var fileSize = tempFile.length / 1024; // Convert bytes to KB

        if (fileSize > targetSizeKB) 
        {
            alert("Needs to be smaller:\n" + fileSize + " " + targetSizeKB + "\n" + saveOptions.quality);
            quality -= 1; // Reduce quality to decrease file size
        } 
        else 
        {
            alert("quality: " + quality);
            break; // Exit the loop if target size is met
        }
    } while (quality > 0);

    tempFile.remove(); // Clean up the temp file
}

Upvotes: -1

Related Questions