// SCRIPT LOGIC // for site in sites: // for year in years: // register_images() // VARIABLE DEFINITIONS // images_to_register = All images to be registered for a given site and year (no target or seed) // batch_images_to_register = Batch images to be registered (no target or seed) // batch_images_all = Target, seed and batch images to be registered var site_name = "cooya" // ADD SITE NAME HERE var batch_size = 15; var parent_dir = File($.fileName).parent.parent.fsName; var batch_download_csv = File(parent_dir + "/coastsnap_sites.csv") // retreive site names from batch_download.csv var csv_data=[]; batch_download_csv.open('r'); while(!batch_download_csv.eof){ var InputLine = batch_download_csv.readln(); if(InputLine.length > 3) csv_data.push(InputLine); } batch_download_csv.close(); var site_names = csv_data.toString().split(",") // Retrieve images parent directory from CoastSnap_Sites.csv var parent_folder_path = File(site_names[9]); var batch_images_to_register = []; // Used in exportLayersToPNG var site_path = parent_folder_path + "/Images/" + site_name; // Retrieve target and seed images for the site var target_folder = new Folder(site_path + '/Target Image'); var seed_folder = new Folder(site_path + '/Target Image' + '/Seed Images'); var target_image = target_folder.getFiles("Target.jpg"); var seed_images = seed_folder.getFiles("*.jpg"); // Retrieve processed image years for the site var processed_folder = new Folder(site_path + '/Processed'); var processed_subFolders = processed_folder.getFiles() // Loop through years for (var j = 0; j < processed_subFolders.length; j++) { var year = processed_subFolders[j].name.toString(); var processed_folder = new Folder(site_path + '/Processed/' + year); var photoshop_folder = new Folder(site_path + '/Photoshop/' + year); var processed_images_all = processed_folder.getFiles("*.jpg"); var photoshop_images = photoshop_folder.getFiles("*.jpg"); // Ignore images in processed that have already been registered var images_to_register = imagesNotRegistered(processed_images_all, photoshop_images); // Register images in batches, to avoid reaching the image limit that causes photoshop to crash for (var k = 0; k < images_to_register.length; k += batch_size) { batch_register_images(k, site_path, site_name, images_to_register, target_image, seed_images); } } // This is the main function, responsible for calling photoshop functions // in a sequential order to register all_images function batch_register_images(batchIndex, site_path, site_name, images_to_register, target_image, seed_images) { var batch_images_all = []; batch_images_to_register = []; batch_images_all.push(target_image[0]) for (var i = 0; i < seed_images.length; i++ ) { batch_images_all.push(seed_images[i]); } for (var i = batchIndex*1; i < batchIndex + batch_size; i++) { if(i < images_to_register.length) { batch_images_all.push(images_to_register[i]); batch_images_to_register.push(images_to_register[i].name); } } stackFiles(batch_images_all); resizeLayers(); lockTarget(); selectAllLayers(); autoAlign(); var target_size = cropToTarget(); var target_width = target_size[0]; var target_height = target_size[1]; savePhotoshopDocument(site_path, site_name); exportLayersToPNG(target_width, target_height, batch_images_to_register, seed_images); // Won't overwrite images that already exist app.activeDocument.close(SaveOptions.DONOTSAVECHANGES) } function imagesNotRegistered(site_images_all, photoshop_images) { var site_images = []; // Extract images that haven't been registered for (var i = 0; i < site_images_all.length; i ++) { // For each site image var isRegistered = false; for (var j = 0; j < photoshop_images.length; j++ ) { // Check if already exists in photoshop images var site_name_CHECK = site_images_all[i].name.slice(0,-4) + '_CHECK.jpg'; if((site_images_all[i].name.toString() == photoshop_images[j].name.toString()) || (site_name_CHECK.toString() == photoshop_images[j].name.toString())) { isRegistered = true; break; } } if(!isRegistered) { // If it doesn't, register it site_images.push(site_images_all[i]); } } return site_images } function stackFiles(sFiles){ var loadLayersFromScript = true; var SCRIPTS_FOLDER = decodeURI(app.path + '/' + localize('$$$/ScriptingSupport/InstalledScripts=Presets/Scripts')); $.evalFile( new File(SCRIPTS_FOLDER + '/Load Files into Stack.jsx')); loadLayers.intoStack(sFiles, false); }; function resizeLayers() { var doc = app.activeDocument; var targetImage = app.activeDocument.artLayers.getByName("Target.jpg") // Retrieve Target image dimensions var target_bounds = targetImage.bounds; var target_width = target_bounds[2] - target_bounds[0]; var target_height = target_bounds[3] - target_bounds[1]; // Update Target Image dimensions var new_width = 1280; preferences.rulerUnits = Units.PIXELS; var s = (new_width/target_width)*100; targetImage.resize(s, s, AnchorPosition.TOPLEFT) // Retrieve new Target image dimensions var target_bounds = targetImage.bounds; var target_width = target_bounds[2] - target_bounds[0]; var target_height = target_bounds[3] - target_bounds[1]; // Make layers similar dimensions to new Target var layerName = doc.layers; for (var ii = 0; ii < layerName.length; ii++) { //looping through all the layers var current_layer = layerName[ii]; preferences.rulerUnits = Units.PIXELS; var b = current_layer.bounds; var layer_width = b[2]-b[0]; var layer_height = b[3]-b[1]; if (layer_height >= layer_width) { var s = (target_height/layer_height)*100; } else { var s = (target_width/layer_width)*100; } current_layer.resize(s, s, AnchorPosition.TOPLEFT) } } function selectAllLayers() { var desc = new ActionDescriptor(); var ref = new ActionReference(); ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') ); desc.putReference( charIDToTypeID('null'), ref ); executeAction( stringIDToTypeID('selectAllLayers'), desc, DialogModes.NO ); }; function autoAlign() { var desc = new ActionDescriptor(); var ref = new ActionReference(); ref.putEnumerated( charIDToTypeID('Lyr '), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') ); desc.putReference( charIDToTypeID('null'), ref ); desc.putEnumerated( charIDToTypeID('Usng'), charIDToTypeID('ADSt'), stringIDToTypeID('ADSContent') ); desc.putEnumerated( charIDToTypeID('Aply'), stringIDToTypeID('projection'), charIDToTypeID('Auto') ); desc.putBoolean( stringIDToTypeID('vignette'), false ); desc.putBoolean( stringIDToTypeID('radialDistort'), false ); executeAction( charIDToTypeID('Algn'), desc, DialogModes.NO ); }; function lockTarget() { var layerRef = app.activeDocument.artLayers.getByName("Target.jpg") layerRef.allLocked = true; app.activeDocument.activeLayer.linkedLayers } // CROP function cropToTarget() { var layerRef = app.activeDocument.artLayers.getByName("Target.jpg") app.activeDocument.crop(layerRef.bounds) var theBounds = app.activeDocument.activeLayer.bounds; var layerWidth = theBounds[2] - theBounds[0]; var layerHeight = theBounds[3] - theBounds[1]; return [layerWidth, layerHeight]; } // TO BE IMPLEMENTED // function imageSize(layerRef) { // } // SAVE PHOTOSHOP DOCUMENT function savePhotoshopDocument(site_path, site_name) { var PSdocumentFile = new File(site_path + '/' + site_name + '.psd'); app.activeDocument.saveAs(PSdocumentFile) } // EXPORT LAYERS TO IMAGES // $.evalFile(File(app.path + '/Presets/Scripts/Export Layers To Files.jsx')); function exportLayersToPNG(target_width, target_height, batch_images_to_register, seed_images){ if(!documents.length) return; var doc = activeDocument; var oldPath = activeDocument.path; var outFolder = new Folder(oldPath + "/Photoshop/" + year); if (!outFolder.exists) { outFolder.create(); } scanLayerSets(doc); function scanLayerSets(el) { // // find layer groups // for(var a=0;a