-
Notifications
You must be signed in to change notification settings - Fork 0
/
convert_images_for_social.jsx
143 lines (121 loc) · 6.64 KB
/
convert_images_for_social.jsx
1
//Copyright 2017 by Hypothetical Inc.// This program is free software: you can redistribute it and/or modify// it under the terms of the GNU General Public License as published by// the Free Software Foundation, either version 3 of the License, or// (at your option) any later version.// This program is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the// GNU General Public License for more details.// You should have received a copy of the GNU General Public License// along with this program. If not, see <http://www.gnu.org/licenses/>.#target photoshopapp.bringToFront();startRulerUnits = app.preferences.rulerUnits; // Record the current ruler units so we can reset to this at the endapp.preferences.rulerUnits = Units.PIXELS;// List of outputs to create// To add additional formats, copy and paste a line and change the values in the newly pasted line// Make sure that all lines EXCEPT the last line ends in a comma// If "constrain: true" then the user will be asked to crop the image manually, but constrained to the ratio given by the height and width for that format// If "constrain: false" then the script will automatically rescale the image using the original ratio and resized to be at most the height and width for the format// If the image is smaller than the format dimensions below, the image will not be resizedvar output_list = [ {suffix: "_instagram", width: 1080.0, height: 1080.0, constrain: true}, {suffix: "_facebook", width: 1200.0, height: 900.0, constrain:true}, {suffix: "_twitter", width: 506.0, height: 253.0, constrain:true}, {suffix: "_pinterest", width: 735.0, height: 1102.0, constrain:true}];// Set JPEG save options// The "quality" option is in the range of 1 to 12 (inclusive) and corresponds to the standard option Photoshop gives when saving a JPEG image manuallyjpgSaveOptions = new JPEGSaveOptions();jpgSaveOptions.embedColorProfile = true;jpgSaveOptions.formatOptions = FormatOptions.STANDARDBASELINE;jpgSaveOptions.matte = MatteType.NONE;jpgSaveOptions.quality = 8;// Return the largest width and height that guarantees that fitX and fitY are within the bounds of maxX and maxYfunction FitRectangleWithinMaxDimensions(fitX, fitY, maxX, maxY){ maxX = maxX * 1.0; // make sure maxX and maxY are float so there aren't division accuracy problems maxY = maxY * 1.0; fitX = fitX * 1.0; fitY = fitY * 1.0; scale = Math.min(maxX / fitX, maxY / fitY); return [fitX * scale, fitY * scale];}// Crop to the given width and height ratio using the action system in Photoshopfunction InteractiveCropToRatio(cropX, cropY){ cropDims = FitRectangleWithinMaxDimensions(cropX, cropY, current_document.width, current_document.height); if(cropDims[0] < current_document.width) { //center crop on X axis top = 0; bottom = cropDims[1]; left = current_document.width / 2 - cropDims[0] / 2; right = current_document.width / 2 + cropDims[0] / 2; } else { left = 0; right = cropDims[0]; top = current_document.height / 2 - cropDims[1] / 2; bottom = current_document.height / 2 + cropDims[1] / 2; } var idCrop = charIDToTypeID( "Crop" ); var desc3 = new ActionDescriptor(); var idT = charIDToTypeID( "T " ); var desc4 = new ActionDescriptor(); var idTop = charIDToTypeID( "Top " ); var idPxl = charIDToTypeID( "#Pxl" ); desc4.putUnitDouble( idTop, idPxl, top ); var idLeft = charIDToTypeID( "Left" ); var idPxl = charIDToTypeID( "#Pxl" ); desc4.putUnitDouble( idLeft, idPxl, left ); var idBtom = charIDToTypeID( "Btom" ); var idPxl = charIDToTypeID( "#Pxl" ); desc4.putUnitDouble( idBtom, idPxl, bottom ); var idRght = charIDToTypeID( "Rght" ); var idPxl = charIDToTypeID( "#Pxl" ); desc4.putUnitDouble( idRght, idPxl, right ); var idRctn = charIDToTypeID( "Rctn" ); desc3.putObject( idT, idRctn, desc4 ); var idAngl = charIDToTypeID( "Angl" ); var idAng = charIDToTypeID( "#Ang" ); desc3.putUnitDouble( idAngl, idAng, 0.000000 ); var idDlt = charIDToTypeID( "Dlt " ); desc3.putBoolean( idDlt, false ); var idcropAspectRatioModeKey = stringIDToTypeID( "cropAspectRatioModeKey" ); var idcropAspectRatioModeClass = stringIDToTypeID( "cropAspectRatioModeClass" ); var idpureAspectRatio = stringIDToTypeID( "pureAspectRatio" ); desc3.putEnumerated( idcropAspectRatioModeKey, idcropAspectRatioModeClass, idpureAspectRatio ); var idCnsP = charIDToTypeID( "CnsP" ); desc3.putBoolean( idCnsP, true ); executeAction( idCrop, desc3, DialogModes.ALL );}//Loop through all documents open in Photoshopfor (i=0; i < app.documents.length; i++) { current_document = app.documents[i]; app.activeDocument = app.documents[i]; base_path = current_document.path; start_state = current_document.activeHistoryState; //Record the current state so we can return to this state at the end current_document.flatten(); current_document.convertProfile("sRGB IEC61966-2.1", Intent.PERCEPTUAL); flattened_state = current_document.activeHistoryState; //Record the current state so we can return to this state after each resize / crop //Loop through each output specified above and crop / resize as appropriate for(j = 0; j < output_list.length; j++) { current_document.activeHistoryState = flattened_state; filename_without_extension = app.activeDocument.name.replace("/\.[^/.]+$/", "") save_path = base_path + "/" + filename_without_extension + output_list[j].suffix; output_file = new File(save_path); if(output_list[j].constrain) { InteractiveCropToRatio(output_list[j].width, output_list[j].height); } $.writeln ("current document: " + current_document.width + ", " + current_document.height); if(current_document.width > output_list[j].width || current_document.height > output_list[j].height) { $.writeln("Resizing"); newDims = FitRectangleWithinMaxDimensions(current_document.width, current_document.height, output_list[j].width, output_list[j].height); $.writeln("new dims: " + newDims[0] + ", " + newDims[1]); current_document.resizeImage(newDims[0], newDims[1], 72, ResampleMethod.AUTOMATIC); } current_document.saveAs(output_file, jpgSaveOptions, true, Extension.LOWERCASE) } current_document.activeHistoryState = start_state;}app.preferences.rulerUnits = startRulerUnits;