10 Replies Latest reply on Feb 23, 2016 2:36 AM by natrev

    Is this possible via Script...!

    natrev Level 3

      Hi Everyone!,


      Transform(Professional) the channel mask based on the two guides(Top and Bottom) and center to product.


      I have one channel named as "Alpha 1" and I need to transform the channel based the guides.


      Please help out this problem or give suggestion to proceed further.



        • 1. Re: Is this possible via Script...!
          c.pfaffenbichler Level 9

          Could you please post step-by-step screenshots (with the pertinent Panels visible) to illustrate the process you wish to automate?

          • 2. Re: Is this possible via Script...!
            natrev Level 3

            Hi Chris,


            Thanks for the reply. Please find the screen shot for the quick reference.


            I have to transform (Professionate) the channel "Alpha 1" based(between) on the two guides.


            Thanks in advance.


            Screen Shot 2016-02-11 at 12.41.30 pm.png

            • 3. Re: Is this possible via Script...!
              JJMack Most Valuable Participant

              I would think you can do what you want. if the alpha channel is a rectangle area as you show here. If the Alpha channel has a shape other than a rectangle that is squared up with the document canvas sides.  Transforming the selection height would distort the selection shape.  You will need to use the bounds of the alpha channel to get the alpha channels width and position


              Here is a script I wrote to position and size and mask an image layer to four guides.  The Mask I create would be the Alpha channel you want. You only have two guides you need four top, bottom, left and right. There is also a bug in photoshop scripting you may run in this area.


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

              // 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


              <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>




              // 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



              // 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[m].direction == Direction.HORIZONTAL) {theVert.push(app.activeDocument.guides[m].coordinate)}

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


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


                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.MI DDLECENTER);


                else {

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

                app.activeDocument.activeLayer.resize(percentageChange,percentageChange,AnchorPosition.MI DDLECENTER);



                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 );}




              // 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++){



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


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




                       var ref = new ActionReference();

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

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



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


                          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 );


              • 4. Re: Is this possible via Script...!
                natrev Level 3

                Hi JJMack,


                Sorry for the late reply and Thanks for your valuable reply.

                Actually I am looking for transform the active channel mask not a active layer.

                Please help me out this problem.

                Thanks in advance.


                • 5. Re: Is this possible via Script...!
                  natrev Level 3

                  Hi Chris,


                  Any update/suggestion on the above mentioned scripts?


                  • 6. Re: Is this possible via Script...!
                    c.pfaffenbichler Level 9

                    I am experiencing stress at work and do unfortunately not have time to look into this at current.

                    • 7. Re: Is this possible via Script...!
                      JJMack Most Valuable Participant

                      The mask channel is a selection. For your resized mask you need the four side as I wrote.  Top, Bottom, Left and Right.  once you have that information you delete the layer mask. Make a selection Top Left, Top Right, Bottom Right, Bottom left.  Then you Add Layer mask.  Like the script I poster added the layer mask on the image layer it resized to fill the selection. Only you do not resize you just replace the layer mask.

                      • 8. Re: Is this possible via Script...!
                        c.pfaffenbichler Level 9

                        I see no option to align alpha channels so storing them as Layer Masks as JJMack apparently did would seem a prudent work-around.

                        Another option would be to load it as a Selection to determine the bounds and then calculate the necessary offset from that – not sure if this would be quicker.

                        • 9. Re: Is this possible via Script...!
                          c.pfaffenbichler Level 9

                          Have you managed to achieve your goal yet?

                          What is the background anyway, why move a Channel?

                          • 10. Re: Is this possible via Script...!
                            natrev Level 3

                            Thanks reply Chris,


                            Finally I get the solution and its working fine. Once again thanks for your follow up.