Skip to main content
tssee
Inspiring
June 7, 2016
Question

insert image guides

  • June 7, 2016
  • 2 replies
  • 626 views

I want to know if you can place an image inside of 4 guides the image has to adapt to the long side.

thank you

This topic has been closed for replies.

2 replies

Pedro Cortez Marques
Legend
June 7, 2016

Although JJMack's code is great an extensible, this is simpler/shorter:

app.preferences.rulerUnits = Units.PIXELS;

if (activeDocument.guides.length == 4) {

    var gh = gv = 0;

    for (var a=0; a < activeDocument.guides.length; a++) {

        if (activeDocument.guides.direction == "Direction.HORIZONTAL") {

            gh = gh+1;

            if (gh==2) {

                var hMax = Math.max(activeDocument.guides.coordinate, h1);

                var hMin = Math.min(activeDocument.guides.coordinate, h1);

            } else {

                var h1 = activeDocument.guides.coordinate;

            }

        } else if (activeDocument.guides.direction == "Direction.VERTICAL") {

            gv = gv+1;

            if (gv==2) {

                var wMax = Math.max(activeDocument.guides.coordinate, w1);

                var wMin = Math.min(activeDocument.guides.coordinate, w1);

            } else {

                var w1 = activeDocument.guides.coordinate;

            }

        }

    }

    if (gh == 2 && gv == 2) {

        app.activeDocument.crop( [new UnitValue(Math.round(wMin),'px'), new UnitValue(Math.round(hMin),'px'), new UnitValue(Math.round(wMax),'px'), new UnitValue(Math.round(hMax),'px')] );

    } else {

        alert("You must have 2 horizontal guides + 2 vertical guides");

    }

} else {

    alert("You must have 4 guides (2 horizontal + 2 vertical)");

}

JJMack
Community Expert
Community Expert
June 7, 2016

There are other thing to take into consideration when you Place in Images.  Depending of Document canvas size and Image size and Photoshop Preferences.  Photoshop mays also scale the smart object layer down in size the fit within canvas.  In that case the current layer bounds will not be the image's actual size. When Placing image you need to test your code well. It also looks to me like you code is cropping the document  not just positing the image to the guides.  However I have not looked are you code well. I saw nothing that would  position position a layer.

JJMack
Pedro Cortez Marques
Legend
June 8, 2016

Oh, !

You are absolutely right JJMack !

I was so in a hurry yesterday that I couldn't figure out. Sorry.

Hope it helps.

app.preferences.rulerUnits = Units.PIXELS;

if (activeDocument.guides.length == 4) { 

    var gh = gv = 0;

    for (var a=0; a < activeDocument.guides.length; a++) { 

        if (activeDocument.guides.direction == "Direction.HORIZONTAL") { 

            gh = gh+1;

            if (gh==2) { 

                var hMax = Math.max(activeDocument.guides.coordinate, h1);

                var hMin = Math.min(activeDocument.guides.coordinate, h1);

            } else {

                var h1 = activeDocument.guides.coordinate;

            } 

        } else if (activeDocument.guides.direction == "Direction.VERTICAL") {

            gv = gv+1;

            if (gv==2) { 

                var wMax = Math.max(activeDocument.guides.coordinate, w1);

                var wMin = Math.min(activeDocument.guides.coordinate, w1);

            } else { 

                var w1 = activeDocument.guides.coordinate;

            } 

        } 

    } 

    if (gh == 2 && gv == 2) {

        var baseImage = activeDocument;

        var myFilePlaced = File.openDialog ("Select 1 Image to place:", undefined, false); // select the image to place

        if (File(decodeURI(myFilePlaced)).exists) {

            var ww = new UnitValue(Math.round(wMax),'px') - new UnitValue(Math.round(wMin),'px');

            var hh = new UnitValue(Math.round(hMax),'px') - new UnitValue(Math.round(hMin),'px');

            var ratio = hh/ww;

            //

            app.open(File(decodeURI(myFilePlaced)));

            (activeDocument.height.as('px') < activeDocument.width.as('px') * ratio) ? activeDocument.resizeImage(undefined, hh, undefined, ResampleMethod.BICUBICSHARPER) : activeDocument.resizeImage(ww, undefined, undefined, ResampleMethod.BICUBICSHARPER);

            activeDocument.selection.selectAll();

            activeDocument.selection.copy();

            activeDocument.close(SaveOptions.DONOTSAVECHANGES);

            //

            activeDocument.selection.deselect();

            var selRegion = Array(Array(new UnitValue(Math.round(wMin),'px'), new UnitValue(Math.round(hMin),'px')),

            Array(new UnitValue(Math.round(wMax),'px'), new UnitValue(Math.round(hMin),'px')),

            Array(new UnitValue(Math.round(wMax),'px'), new UnitValue(Math.round(hMax),'px')),

            Array(new UnitValue(Math.round(wMin),'px'), new UnitValue(Math.round(hMax),'px')),

            Array(new UnitValue(Math.round(wMin),'px'), new UnitValue(Math.round(hMin),'px')));

            activeDocument.selection.select(selRegion);

            activeDocument.paste(true); // paste Into

        }

    } else {

        alert("You must have 2 horizontal guides + 2 vertical guides");

    }

} else {

    alert("You must have 4 guides (2 horizontal + 2 vertical)");

}

JJMack
Community Expert
Community Expert
June 7, 2016

Yes you can resize the image layer to fit within that size area. Then position the layer within that area.  You can also resize the image layer to fill the size area position the layer to that area and mask off any excess. Its a good Idea to first covert the image layer to a smart object layer.  Here is a script to do the later fill the area marked by four guides. Set the four guides and Target the image layer or place in the image before using the script.  Photoshop scripting has a nasty bug that this scripts code around that bug. The script does not do the place image.  My Photo Collage Toolkit  image populating scripts do the place image but they size and position and the images to Alpha Channels not guides. It would be difficult to know where to position images if the were lore that 4 guides.  If there were 36 guides where would you position the 9 images. Which guides would you use.  Using Alpha  Channels I can place up to 53 images size them, position them,  and shape them.  IMO Alpha channels are better then guides  for positioning images.  But Photoshop only supports 53 Alpha Channels so your limited the 53 Images.

There are two aspect ratio involved. The Image aspect ratio and the Guid area aspect ratio it depenst on the two aspect ratios and how you want to handel the image resisze which side you will need to resize to.

/* ==========================================================

// 2014  John J. McAssey (JJMack)

// ======================================================= */

// This script is supplied as is. It is provided as freeware.

// The author accepts no liability for any problems arising from its use.

/* Help Category note tag menu can be used to place script in automate menu

<javascriptresource>

<about>$$$/JavaScripts/FitImageToGuides/About=JJMack's FitImageToGuides .^r^rCopyright 2014 Mouseprints.^r^rFour and only four guides are required</about>

<category>JJMack's Script</category>

</javascriptresource>

*/

// enable double-clicking from Mac Finder or Windows Explorer

#target photoshop // this command only works in Photoshop CS2 and higher

// bring application forward for double-click events

app.bringToFront();

// ensure at least one document open

if (!documents.length) alert('There are no documents open.', 'No Document');

else {

  // declare Global variables

  //main(); // at least one document exists proceed

  app.activeDocument.suspendHistory('Fix Image to Guides','main()');  //problem if there is a selection a layer resize Photoshop back up a history step ?

}

///////////////////////////////////////////////////////////////////////////////

//                            main function                            

///////////////////////////////////////////////////////////////////////////////

function main() {

  // declare local variables

  var orig_ruler_units = app.preferences.rulerUnits;

  var orig_type_units = app.preferences.typeUnits;

  var orig_display_dialogs = app.displayDialogs;

  app.preferences.rulerUnits = Units.PIXELS; // Set the ruler units to PIXELS

  app.preferences.typeUnits = TypeUnits.POINTS;   // Set Type units to POINTS

  app.displayDialogs = DialogModes.NO; // Set Dialogs off

  try { code(); }

  // display error message if something goes wrong

  catch(e) { alert(e + ': on line ' + e.line, 'Script Error', true); }

  app.displayDialogs = orig_display_dialogs; // Reset display dialogs

  app.preferences.typeUnits  = orig_type_units; // Reset ruler units to original settings

  app.preferences.rulerUnits = orig_ruler_units; // Reset units to original settings

}

///////////////////////////////////////////////////////////////////////////////

//                           main function end                           

///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////////////////////

// The real code is embedded into this function so that at any point it can return

// to the main line function to let it restore users edit environment and end     

//////////////////////////////////////////////////////////////////////////////////////////////

function code() {

  if (app.activeDocument.guides.length != 4) { alert("Four and only four Guides are required"); return; } // quit

  // get guides;

  var theVert = new Array;

  var theHor = new Array;

  for (var m = 0; m < app.activeDocument.guides.length; m++) {

  if (app.activeDocument.guides.direction == Direction.HORIZONTAL) {theVert.push(app.activeDocument.guides.coordinate)}

  else {theHor.push(app.activeDocument.guides.coordinate)}

    };

  if (theHor.length != 2 || theVert.length != 2) { alert("Four Guides two vertical and two horizontal are required"); return; } // quit

  getTarget=getSelectedLayersIdx();

  if (getTarget.length!=1){ alert("The number of layers targeted is " + getTarget.length ); return; } // quit

  if (app.activeDocument.activeLayer.isBackgroundLayer ) { alert("Can not resize the background layer"); return; } // quit

  if (!app.activeDocument.activeLayer.visible ) { alert("Active layer is  not visible"); return; } // quit

  //if (hasLayerMask()) { alert("Active layer is  Masked"); return; } // quit

  if (app.activeDocument.activeLayer.kind == LayerKind.NORMAL  || app.activeDocument.activeLayer.kind == LayerKind.SMARTOBJECT && hasLayerMask()) { deleteLayerMask ();}

  if (app.activeDocument.activeLayer.kind != LayerKind.NORMAL  && app.activeDocument.activeLayer.kind != LayerKind.SMARTOBJECT )  {

  alert("Active layer is " + app.activeDocument.activeLayer.kind); return; } // quit

  // set selection to the area defined but the guide lines the selection may get undone by the bug in .resize() backing up a step in histoty ???

  app.activeDocument.selection.select([[theHor[0], theVert[0]], [theHor[1], theVert[0]], [theHor[1], theVert[1]], [theHor[0], theVert[1]]]);

  // resize current normal layer or smart object layer to just cover selection canvas area aspect ratio and size and mask off any overflow

  var SB = app.activeDocument.selection.bounds; // Get selection bounds

  var SWidth = (SB[2].value) - (SB[0].value); // Area width

  var SHeight = (SB[3].value) - (SB[1].value); // Area height

  var LB = app.activeDocument.activeLayer.bounds; // Get Active layers bounds

  var LWidth = (LB[2].value) - (LB[0].value); // Area width

  var LHeight = (LB[3].value) - (LB[1].value); // Area height

  var userResampleMethod = app.preferences.interpolation; // Save interpolation settings

  app.preferences.interpolation = ResampleMethod.BICUBIC; // resample interpolation bicubic

  app.activeDocument.selection.deselect(); // This deselect work around Adobe Bug in CS5, CS6, CC and CC 2014

  // Since Adobe does not fix old releases of Photoshop this is a necessary work around for many releases of Photoshop

  //alert("Before re-size history");  // Added to debug Adobe Resize Bug

  try {

  if (LWidth/LHeight<SWidth/SHeight) { // layer's Aspect Ratio less the Canvas area Aspect Ratio

  var percentageChange = ((SWidth/LWidth)*100); // Resize to canvas area width

  app.activeDocument.activeLayer.resize(percentageChange,percentageChange,AnchorPosition.MIDDLECENTER);

  }

  else {

  var percentageChange = ((SHeight/LHeight)*100); // resize to canvas area height

  app.activeDocument.activeLayer.resize(percentageChange,percentageChange,AnchorPosition.MIDDLECENTER);

  }

  }

  catch(e) {

  app.preferences.interpolation = userResampleMethod; // Reset interpolation setting

  selectFront(); // Photoshop make top layer current when none are targeted

  code(); // Retry  with top visible layer selected targeted

  return; // rest would have been done during the retry

  }

  //alert("After re-size history");    // Added to debug Adobe Resize Bug

  app.preferences.interpolation = userResampleMethod; // Reset interpolation setting

  // Seems to be a bug in  resize() the document seems to first be backed up a step in history

  app.activeDocument.selection.select([[theHor[0], theVert[0]], [theHor[1], theVert[0]], [theHor[1], theVert[1]], [theHor[0], theVert[1]]]); // redo the selection

  align('AdCH'); // align to horizontal centers

  align('AdCV'); // align to vertical centers

  addLayermask(); // add layer mask to mask off excess

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Helper Functions

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

function align(method) {

  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" ), charIDToTypeID( method ) );

  try{executeAction( charIDToTypeID( "Algn" ), desc, DialogModes.NO );}

  catch(e){}

}

///////////////////////////////////////////////////////////////////////////////  

// Function: hasLayerMask  

// Usage: see if there is a raster layer mask  

// Input: <none> Must have an open document  

// Return: true if there is a vector mask  

///////////////////////////////////////////////////////////////////////////////  

function hasLayerMask() {  

  var hasLayerMask = false;  

  try {  

  var ref = new ActionReference();  

  var keyUserMaskEnabled = app.charIDToTypeID( 'UsrM' );  

  ref.putProperty( app.charIDToTypeID( 'Prpr' ), keyUserMaskEnabled );  

  ref.putEnumerated( app.charIDToTypeID( 'Lyr ' ), app.charIDToTypeID( 'Ordn' ), app.charIDToTypeID( 'Trgt' ) );  

  var desc = executeActionGet( ref );  

  if ( desc.hasKey( keyUserMaskEnabled ) ) { hasLayerMask = true; }  

  }

  catch(e) { hasLayerMask = false; }  

  return hasLayerMask;  

}  

function getSelectedLayersIdx(){

      var selectedLayers = new Array;

      var ref = new ActionReference();

      ref.putEnumerated( charIDToTypeID("Dcmn"), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );

      var desc = executeActionGet(ref);

      if( desc.hasKey( stringIDToTypeID( 'targetLayers' ) ) ){

         desc = desc.getList( stringIDToTypeID( 'targetLayers' ));

          var c = desc.count

          var selectedLayers = new Array();

          for(var i=0;i<c;i++){

            try{

               activeDocument.backgroundLayer;

               selectedLayers.push(  desc.getReference( i ).getIndex() );

            }catch(e){

               selectedLayers.push(  desc.getReference( i ).getIndex()+1 );

            }

          }

       }else{

         var ref = new ActionReference();

         ref.putProperty( charIDToTypeID("Prpr") , charIDToTypeID( "ItmI" ));

         ref.putEnumerated( charIDToTypeID("Lyr "), charIDToTypeID("Ordn"), charIDToTypeID("Trgt") );

         try{

            activeDocument.backgroundLayer;

            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" ))-1);

         }catch(e){

            selectedLayers.push( executeActionGet(ref).getInteger(charIDToTypeID( "ItmI" )));

         }

      }

      return selectedLayers;

};

function selectFront() {

// Alt+. shortcut select ftont visible layer

var idslct = charIDToTypeID( "slct" );

    var desc250 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref207 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idFrnt = charIDToTypeID( "Frnt" );

        ref207.putEnumerated( idLyr, idOrdn, idFrnt );

    desc250.putReference( idnull, ref207 );

    var idMkVs = charIDToTypeID( "MkVs" );

    desc250.putBoolean( idMkVs, false );

executeAction( idslct, desc250, DialogModes.NO );

}

function deleteLayerMask (apply) {

// Delet Layer mask default to not apply first

if (apply == undefined) {var apply = false};

try {

var idDlt = charIDToTypeID( "Dlt " );

    var desc9 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref5 = new ActionReference();

        var idChnl = charIDToTypeID( "Chnl" );

        var idChnl = charIDToTypeID( "Chnl" );

        var idMsk = charIDToTypeID( "Msk " );

        ref5.putEnumerated( idChnl, idChnl, idMsk );

    desc9.putReference( idnull, ref5 );

    var idAply = charIDToTypeID( "Aply" );

    desc9.putBoolean( idAply, apply );

executeAction( idDlt, desc9, DialogModes.NO );

}

catch (e) {}

};

function addLayermask(){

// Add layer Mask

var idMk = charIDToTypeID( "Mk  " );

    var desc52 = new ActionDescriptor();

    var idNw = charIDToTypeID( "Nw  " );

    var idChnl = charIDToTypeID( "Chnl" );

    desc52.putClass( idNw, idChnl );

    var idAt = charIDToTypeID( "At  " );

        var ref19 = new ActionReference();

        var idChnl = charIDToTypeID( "Chnl" );

        var idChnl = charIDToTypeID( "Chnl" );

        var idMsk = charIDToTypeID( "Msk " );

        ref19.putEnumerated( idChnl, idChnl, idMsk );

    desc52.putReference( idAt, ref19 );

    var idUsng = charIDToTypeID( "Usng" );

    var idUsrM = charIDToTypeID( "UsrM" );

    var idRvlS = charIDToTypeID( "RvlS" );

    desc52.putEnumerated( idUsng, idUsrM, idRvlS );

executeAction( idMk, desc52, DialogModes.NO );

// Un link layer mask just added fron the layers content

var idsetd = charIDToTypeID( "setd" );

    var desc2 = new ActionDescriptor();

    var idnull = charIDToTypeID( "null" );

        var ref1 = new ActionReference();

        var idLyr = charIDToTypeID( "Lyr " );

        var idOrdn = charIDToTypeID( "Ordn" );

        var idTrgt = charIDToTypeID( "Trgt" );

        ref1.putEnumerated( idLyr, idOrdn, idTrgt );

    desc2.putReference( idnull, ref1 );

    var idT = charIDToTypeID( "T   " );

        var desc3 = new ActionDescriptor();

        var idUsrs = charIDToTypeID( "Usrs" );

        desc3.putBoolean( idUsrs, false );

    var idLyr = charIDToTypeID( "Lyr " );

    desc2.putObject( idT, idLyr, desc3 );

executeAction( idsetd, desc2, DialogModes.NO );

}

JJMack