Copy link to clipboard
Copied
How do we lock the resize of canvas so that if I enter a value in the width bos the height box should automatically be populated and vice versa.
See that attached image. In this case if I enter 700 in the width box, the height should be automatically populated with 700. Is it possible? If yes how to do it?
Copy link to clipboard
Copied
That is what the link icon does in Image > Image Size.
Canvas size crops if a lesser value is entered, the width and height fields are independent by design.
This could be scripted if you really wish to crop content from 800px to 700px square rather than resize.
Copy link to clipboard
Copied
Yes, I'm aware of image resize. I'm asking about canvas resize. I'm cropping images in bulk and I need to adjust to square for which I've to enter values for width and height in duplicate. If there is a way for one value to be automatically locked to other value then it will save few keystrokes per image.
Copy link to clipboard
Copied
Just an idea; will it work for you to change the setting to Relative and type a number there?
Jane
Copy link to clipboard
Copied
Hi Mike!
I'm not aware of a function in that window pane to make both inputs the same when you type in one. By chance, are you cropping the images from the same anchor point and the same size each time? If so you could turn that step into an recorded action and make it a one button click rather than opening up the menu each time. There may be a way to do a similar option through the crop tool and actions as well.
Copy link to clipboard
Copied
Unfortunately it's all different image sizes so actions will not help.
Copy link to clipboard
Copied
Is the anchor point always set to centre?
Is there a mathematical rule or formula that could be automated?
Copy link to clipboard
Copied
No, there is no formula as such. I 've to visually see tha image and crop/resize accordingly. Each image is different and cropping is done at different places in the main image.
Copy link to clipboard
Copied
The native canvas size command doesn't have a preview, it is not visual, except for not liking the result undoing and repeating.
The script is the same, no preview.
Perhaps you are looking for the crop tool at 1:1 ratio or perhaps a square selection based approach?
Such as enter selection square size value, interactive transform of selection position for live preview, commit transform then automated crop... Similar to this;
Copy link to clipboard
Copied
You can post a feature request in below link
Copy link to clipboard
Copied
Here is a script to resize the canvas height using the width value from middle centre:
/*
Square canvas resize.jsx
Stephen Marsh, v1.0 - 5th January 2022
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-lock-canvas-resizing/m-p/12634283
*/
#target photoshop
function main() {
var savedRuler = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var doc = app.activeDocument;
while (isNaN(squareCanvasSize = prompt("Square canvas size from middle center (px):", "")));
if (squareCanvasSize === null) {
//alert('Script cancelled!');
return
}
while (squareCanvasSize.length === 0) {
squareCanvasSize = prompt("Blank value not accepted! Square canvas size from middle center (px):", "");
}
var squareInteger = parseInt(squareCanvasSize);
doc.resizeCanvas(squareInteger, squareInteger, AnchorPosition.MIDDLECENTER);
app.preferences.rulerUnits = savedRuler;
}
app.activeDocument.suspendHistory("Square canvas resize", "main()");
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
How am I suppose to run it? There was no Scripts folder inside Presets so I created it and copied scrip there. It should be showing under File -> Script? Or how to run it now?
Copy link to clipboard
Copied
Full instructions were provided in the link under the script code. Apart from repeating them I don't have anything further to add or say differently.
EDIT:
If these simple instructions are too abbreviated, you may need to read on...
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html
Copy link to clipboard
Copied
The following script provides an interactive square crop, based on the selection size entered in pixels.
Only two user interactions are required:
1) Entering a desired square selection size in pixel values (an integer)
2) Don't resize the transform selection edges, just move the entire selection to where the crop should be performed, then press the enter/return key or press the "tick" in the options bar for "Commit transform", then the script will continue to automatically crop the image.
/*
Interactive square canvas crop.jsx
Stephen Marsh, v1.0 - 5th January 2022
https://community.adobe.com/t5/photoshop-ecosystem-discussions/how-to-lock-canvas-resizing/m-p/12634283
*/
#target photoshop
function main() {
var savedRuler = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var inputSelection;
while (isNaN(inputSelection = prompt("Enter a square selection size (pixels):", "")));
if (inputSelection === null) {
alert('Script cancelled!');
return;
}
while (inputSelection.length === 0) {
inputSelection = prompt("Blank value not accepted! Enter a square selection size (pixels):", "");
}
var finalSelection = parseInt(inputSelection);
app.activeDocument.selection.select( [ [0,0], [0,finalSelection], [finalSelection,finalSelection], [finalSelection,0] ] );
centerSelectionHack();
interactiveTransformSelection();
cropToSelection();
app.preferences.rulerUnits = savedRuler;
}
app.activeDocument.suspendHistory("Square canvas crop", "main()");
// Functions
function interactiveTransformSelection() {
var idtransform = stringIDToTypeID("transform");
var desc2058 = new ActionDescriptor();
var idnull = stringIDToTypeID("null");
var ref311 = new ActionReference();
var idchannel = stringIDToTypeID("channel");
var idselection = stringIDToTypeID("selection");
ref311.putProperty(idchannel, idselection);
desc2058.putReference(idnull, ref311);
var idfreeTransformCenterState = stringIDToTypeID("freeTransformCenterState");
var idquadCenterState = stringIDToTypeID("quadCenterState");
var idQCSAverage = stringIDToTypeID("QCSAverage");
desc2058.putEnumerated(idfreeTransformCenterState, idquadCenterState, idQCSAverage);
var idoffset = stringIDToTypeID("offset");
var desc2059 = new ActionDescriptor();
var idhorizontal = stringIDToTypeID("horizontal");
var idpixelsUnit = stringIDToTypeID("pixelsUnit");
desc2059.putUnitDouble(idhorizontal, idpixelsUnit, 0);
var idvertical = stringIDToTypeID("vertical");
var idpixelsUnit = stringIDToTypeID("pixelsUnit");
desc2059.putUnitDouble(idvertical, idpixelsUnit, 0);
var idoffset = stringIDToTypeID("offset");
desc2058.putObject(idoffset, idoffset, desc2059);
var idinterfaceIconFrameDimmed = stringIDToTypeID("interfaceIconFrameDimmed");
var idinterpolationType = stringIDToTypeID("interpolationType");
var idnearestNeighbor = stringIDToTypeID("nearestNeighbor");
desc2058.putEnumerated(idinterfaceIconFrameDimmed, idinterpolationType, idnearestNeighbor);
executeAction(idtransform, desc2058, DialogModes.ALL);
}
function centerSelectionHack() {
/* It gets the job done, but surely there is a more elegant way...
I couldn't get selection.translate() to work as intended */
// Create solid colour layer from active selection
var idmake = stringIDToTypeID("make");
var desc2180 = new ActionDescriptor();
var idnull = stringIDToTypeID("null");
var ref365 = new ActionReference();
var idcontentLayer = stringIDToTypeID("contentLayer");
ref365.putClass(idcontentLayer);
desc2180.putReference(idnull, ref365);
var idusing = stringIDToTypeID("using");
var desc2181 = new ActionDescriptor();
var idtype = stringIDToTypeID("type");
var desc2182 = new ActionDescriptor();
var idcolor = stringIDToTypeID("color");
var desc2183 = new ActionDescriptor();
var idred = stringIDToTypeID("red");
desc2183.putDouble(idred, 255.000000);
var idgrain = stringIDToTypeID("grain");
desc2183.putDouble(idgrain, 255.000000);
var idblue = stringIDToTypeID("blue");
desc2183.putDouble(idblue, 255.000000);
var idRGBColor = stringIDToTypeID("RGBColor");
desc2182.putObject(idcolor, idRGBColor, desc2183);
var idsolidColorLayer = stringIDToTypeID("solidColorLayer");
desc2181.putObject(idtype, idsolidColorLayer, desc2182);
var idcontentLayer = stringIDToTypeID("contentLayer");
desc2180.putObject(idusing, idcontentLayer, desc2181);
executeAction(idmake, desc2180, DialogModes.NO);
// Fill opacity to 0%
app.activeDocument.activeLayer.fillOpacity = 0;
// Centre active layer on canvas
app.activeDocument.activeLayer.translate(app.activeDocument.width / 2 - (app.activeDocument.activeLayer.bounds[0] + app.activeDocument.activeLayer.bounds[2]) / 2,
app.activeDocument.height / 2 - (app.activeDocument.activeLayer.bounds[1] + app.activeDocument.activeLayer.bounds[3]) / 2);
// Set selection to mask channel
var idset = stringIDToTypeID("set");
var desc2554 = new ActionDescriptor();
var idnull = stringIDToTypeID("null");
var ref429 = new ActionReference();
var idchannel = stringIDToTypeID("channel");
var idselection = stringIDToTypeID("selection");
ref429.putProperty(idchannel, idselection);
desc2554.putReference(idnull, ref429);
var idto = stringIDToTypeID("to");
var ref430 = new ActionReference();
var idchannel = stringIDToTypeID("channel");
var idchannel = stringIDToTypeID("channel");
var idmask = stringIDToTypeID("mask");
ref430.putEnumerated(idchannel, idchannel, idmask);
desc2554.putReference(idto, ref430);
executeAction(idset, desc2554, DialogModes.NO);
// Remove temp solid colour layer
app.activeDocument.activeLayer.remove();
}
function cropToSelection() {
var idcrop = stringIDToTypeID("crop");
executeAction(idcrop, undefined, DialogModes.NO);
// Deselect
app.activeDocument.selection.deselect();
}
If these simple instructions are too abbreviated, you may need to read on...
https://prepression.blogspot.com/2017/11/downloading-and-installing-adobe-scripts.html