Skip to content

Instantly share code, notes, and snippets.

@jawinn
Created September 30, 2015 15:38
Show Gist options
  • Save jawinn/ab4df1c33d0743e41fd3 to your computer and use it in GitHub Desktop.
Save jawinn/ab4df1c33d0743e41fd3 to your computer and use it in GitHub Desktop.
Fit Layer To Canvas - Photoshop Script
// FIT LAYER TO CANVAS
// via https://forums.adobe.com/message/5413957#5413957
var maintainAspectRatio;// set to true to keep aspect ratio
if(app.documents.length>0){
app.activeDocument.suspendHistory ('Fit Layer to Canvas', 'FitLayerToCanvas('+maintainAspectRatio+')');
}
function FitLayerToCanvas( keepAspect ){// keepAspect:Boolean - optional. Default to false
var doc = app.activeDocument;
var layer = doc.activeLayer;
// do nothing if layer is background or locked
if(layer.isBackgroundLayer || layer.allLocked || layer.pixelsLocked
|| layer.positionLocked || layer.transparentPixelsLocked ) return;
// do nothing if layer is not normal artLayer or Smart Object
if( layer.kind != LayerKind.NORMAL && layer.kind != LayerKind.SMARTOBJECT) return;
// store the ruler
var defaultRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;
var width = doc.width.as('px');
var height =doc.height.as('px');
var bounds = app.activeDocument.activeLayer.bounds;
var layerWidth = bounds[2].as('px')-bounds[0].as('px');
var layerHeight = bounds[3].as('px')-bounds[1].as('px');
// move the layer so top left corner matches canvas top left corner
layer.translate(new UnitValue(0-layer.bounds[0].as('px'),'px'), new UnitValue(0-layer.bounds[1].as('px'),'px'));
if( !keepAspect ){
// scale the layer to match canvas
layer.resize( (width/layerWidth)*100,(height/layerHeight)*100,AnchorPosition.TOPLEFT);
}else{
var layerRatio = layerWidth / layerHeight;
var newWidth = width;
var newHeight = ((1.0 * width) / layerRatio);
if (newHeight >= height) {
newWidth = layerRatio * height;
newHeight = height;
}
var resizePercent = newWidth/layerWidth*100;
app.activeDocument.activeLayer.resize(resizePercent,resizePercent,AnchorPosition.TOPLEFT);
}
// restore the ruler
app.preferences.rulerUnits = defaultRulerUnits;
}
@Ypdes
Copy link

Ypdes commented Sep 3, 2023

Thank you jawinn! Really useful script. But it doesn't fit layer proportionally. I fixed it:

// FIT LAYER TO CANVAS
// via https://forums.adobe.com/message/5413957#5413957
var maintainAspectRatio = true; // set to true to keep aspect ratio

if (app.documents.length > 0) {
app.activeDocument.suspendHistory('Fit Layer to Canvas', 'FitLayerToCanvas(' + maintainAspectRatio + ')');
}

function FitLayerToCanvas(keepAspect) {
// keepAspect: Boolean - optional. Default to false
var doc = app.activeDocument;
var layer = doc.activeLayer;

// do nothing if layer is background or locked
if (layer.isBackgroundLayer || layer.allLocked || layer.pixelsLocked || layer.positionLocked || layer.transparentPixelsLocked) return;

// do nothing if layer is not a normal artLayer or Smart Object
if (layer.kind != LayerKind.NORMAL && layer.kind != LayerKind.SMARTOBJECT) return;

// store the ruler
var defaultRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

var width = doc.width.as('px');
var height = doc.height.as('px');
var bounds = app.activeDocument.activeLayer.bounds;
var layerWidth = bounds[2].as('px') - bounds[0].as('px');
var layerHeight = bounds[3].as('px') - bounds[1].as('px');

// move the layer so the top-left corner matches the canvas top-left corner
layer.translate(new UnitValue(0 - bounds[0].as('px'), 'px'), new UnitValue(0 - bounds[1].as('px'), 'px'));

if (keepAspect) {
var layerRatio = layerWidth / layerHeight;
var canvasRatio = width / height;

if (layerRatio > canvasRatio) {
  var newWidth = width;
  var newHeight = newWidth / layerRatio;
} else {
  var newHeight = height;
  var newWidth = newHeight * layerRatio;
}

var resizePercent = (newWidth / layerWidth) * 100;
app.activeDocument.activeLayer.resize(resizePercent, resizePercent, AnchorPosition.TOPLEFT);

} else {
// scale the layer to match the canvas
layer.resize((width / layerWidth) * 100, (height / layerHeight) * 100, AnchorPosition.TOPLEFT);
}

// restore the ruler
app.preferences.rulerUnits = defaultRulerUnits;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment