Skip to main content
Known Participant
May 30, 2018
Question

Photoshop Scripts for Image Layers (Javascript)

  • May 30, 2018
  • 4 replies
  • 9490 views

Hi,

I have some code which opens a template file, then code below which opens another file. It then duplicates the layer on the second file to original file opened.

var fileRef = new File("/z/FILE.psd"); 

if(fileRef.exists){ 

app.open (fileRef); 

app.activeDocument.activeLayer.duplicate (app.documents.getByName("psd.psd"));

app.activeDocument = app.documents.getByName("FILE.psd"); 

app.activeDocument.activeLayer.name = "none.psd";

I have a couple of requirements.

1. Once it has copied, i would like the second file to then close the file down i tried below but didnt work:

this.closeDoc(true)

2. When the image is copied it places it top left hand corner, but i need to adjust the H and V axis to position it within the document.

Can anyone help with this?

Thank you.

This topic has been closed for replies.

4 replies

web2000Author
Known Participant
May 31, 2018

Hi, we tried several options but due to the range of sizes of images we couldnt get it right. So in the end we moved all the image on to a new template file with white background all the same size within that file, so that they then always positioned in the same location from image to image.

web2000Author
Known Participant
May 31, 2018

Thanks very much for your help guys. See i have two issues with my code which i found out after testing.

  1. The images being opened, then duplicated and moved are different sizes. So for example depending upon the size of the layer/file being moved, it will position it in a different place each time. Is there a way to move an item to a position based on its centre point so that even if a file is 50px x 50px or 200px x 200px it will still position them both central to a position?

  1. My code opens a file then duplicates the layer to my main file, but it duplicates the layer as "Layer 1" which a layer is already called that in my main document and causes issues. I need a way if renaming the layer when its duplicated on to the other file so it doesn’t cause issues with those layers.
JJMack
Community Expert
Community Expert
May 31, 2018

What you see happing is not what you write is happening.  Your images most likely have different Print DPI resolutions.   Photoshop want to maintain your Images pixel quality so will not ness with the pixels you have for you images.  A document can not have more than one resolution. So when you add a new Images layer the has the pixels from the other resolution image its size may look like it has changed.  too big or too small.   The image  has not been changed your have the exact same pixel in both documents. When you scale the layer  to match the scale of the image you pasted the image into the number if pixels will be changed and you will lose some image quality.

Centering the pasted layer is easy.  However, it will not resolve any scaling issue.  Select all to select the image canvas size then use align layers to selection. To the horizontal and vertical center of the selection.

In a script you can rename a layer name is read write and if you use Action manager scriptlistener code to duplicate the layer into the other document  you can name the layer that will be created with in the other document as part of the layer duplicate process like you can using Photoshop Layer>Duplicate UI. And the new layer should be centered.  If not You can move the layer and align to the canvas center using a select all and align layers to selection.

JJMack
Chuck Uebele
Community Expert
Community Expert
May 31, 2018

When you open files, assign it a variable:

var firstDoc = app.activeDocument;

var secondDoc = app.open(fileRef)//as you have in your case

//close the second:

secondDoc.close(SaveOptions.DONOTSAVECHANGES);

To move the layer calculate the change in distance:

var x = 400//or wherever you want the canvas moved

var y = 300//same thing

//Your moved layer should be the active layer of the current doc, if the second doc closed so...

var movedLayer = firstDoc.activeLayer;

movedLayer.translate(x-movedLayer.bounds[0],y-movedLayer.bounds[1]);

web2000Author
Known Participant
May 30, 2018

I managed to use this code to close

app.activeDocument.close(SaveOptions.DONOTSAVECHANGES);

and found this thread https://forums.adobe.com/thread/2372960

  1. #target photoshop; 
  2. if(documents.length) main(); 
  3. function main(){ 
  4. var X = 300; //Top left 
  5. var Y = 300; //Top left 
  6. try{ 
  7. var doc = app.activeDocument; 
  8. app.displayDialogs = DialogModes.NO; 
  9. var strtRulerUnits = app.preferences.rulerUnits; 
  10. var strtTypeUnits = app.preferences.typeUnits; 
  11. app.preferences.rulerUnits = Units.PIXELS; 
  12. app.preferences.typeUnits = TypeUnits.PIXELS; 
  13. activeDocument.activeLayer = activeDocument.artLayers.getByName("Layer 1"); 
  14. var LB = activeDocument.activeLayer.bounds; 
  15. activeDocument.activeLayer.translate(X-LB[0].value,Y-LB[1].value); 
  16. }catch(e){alert(e + "\nLine number = " + e.line);} 
  17. finally{ 
  18. app.preferences.rulerUnits = strtRulerUnits; 
  19. app.preferences.typeUnits = strtTypeUnits; 
  20.     } 
  21. }; 

and the above code moved the canvas

JJMack
Community Expert
Community Expert
May 31, 2018

That script you posted mover layer 1 not the canvas.  The canvas top left pixels is  0X,0Y the bottom right is WidtpxX,HeightpxY The Script moves  the active layer, Layer 1 top left to canvas position 300x,300y.

You can get the Document Canvas Bounds and you can get the layer bounds and you can set as selection to a pixel and you can align the layer horizontally and vertically  relative to that pixel selected.  A Photoshop Script can position a layer many ways using different Photoshop tools.

Here is a quite simple script that will place in a watermark file into a document resize the watermark smart object layer relative to the Document height then position the resized layer to the bottom left or right of the document.

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

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

/*

<javascriptresource>

<about>$$$/JavaScripts/PlaceWatermark/About=JJMack's PlaceWatermark ^r^rCopyright 2017 Mouseprints.net^r^rPhotoshop Script^rCustomize using first four var</about>

<category>JJMack's Script</category>

</javascriptresource>

*/

#target photoshop; 

app.bringToFront(); 

var logoFile = "~/Desktop/JJMack.png"; // Watermark file should be large for resize down works better than up

var LogoSize = 10; // percent of document height to resize Watermark to

var LogoMargin = 1;                                         // percent of Document height the Watermark should have as a margin

var BottomLetf = false; // false = Bottom Right true Bottom Left

placeWatermark(logoFile, LogoSize, LogoMargin);             // Place Watermark into the bottom of the document

function placeWatermark(Image,Size,Margin){ 

if(!documents.length) return;  // if no document return

try{ 

var doc = app.activeDocument; // set Doc object to active document

app.displayDialogs = DialogModes.NO; // Dialog off

var strtRulerUnits = app.preferences.rulerUnits; // Save Users ruler units

var strtTypeUnits = app.preferences.typeUnits; // Save Users Type units

app.preferences.rulerUnits = Units.PIXELS; // work with pixels

app.preferences.typeUnits = TypeUnits.PIXELS; // work with pixels

var fileObj = new File(Image);                 // the passed file

if(!fileObj.exists){  // If file does not exits tell user

alert(fileObj.name  + " does not exist!"); 

return; 

var layers = app.activeDocument.layers; // get layers

app.activeDocument.activeLayer = layers[0] // Target Top Layer

placeFile(fileObj); // Place in file the Watermark png file

activeDocument.activeLayer.resize(100 ,100,AnchorPosition.MIDDLECENTER); // Insure Place did not scale layer 

var SB = activeDocument.activeLayer.bounds; // get layers bounds

var layerHeight = SB[3] - SB[1]; // get layers height 

var resizePercent = (100/layerHeight)*(Size/100*doc.height.value); // Percent to resize by

activeDocument.activeLayer.resize(resizePercent ,resizePercent,AnchorPosition.MIDDLECENTER);  // Resize width and height by percentage

SB = activeDocument.activeLayer.bounds; // get resized layers bounds 

activeDocument.activeLayer.translate(-SB[0].value,-SB[1].value); // Move resized layer to top left canvas corner

var LayerWidth = (SB[2].value - SB[0].value); // get resized layers width 

var LayerHeight = (SB[3].value - SB[1].value);  // get resized layers height

marginSize = Margin/100*doc.height.value; // Margin size

// move resized watermark into the document lower right corner with some margin or lower left

if  ( BottomLetf) {activeDocument.activeLayer.translate(marginSize,( doc.height.value -marginSize - LayerHeight));}

else {activeDocument.activeLayer.translate((doc.width.value -marginSize - LayerWidth),( doc.height.value -marginSize - LayerHeight));}

}

catch(e) { alert(e + ': on line ' + e.line); } // inform user of error 

finally{ 

app.preferences.rulerUnits = strtRulerUnits; // Restore user ruler units 

app.preferences.typeUnits = strtTypeUnits; // Restore user type units   

}; 

};

function placeFile(placeFile) { 

    var desc21 = new ActionDescriptor(); 

    desc21.putPath( charIDToTypeID('null'), new File(placeFile) ); 

    desc21.putEnumerated( charIDToTypeID('FTcs'), charIDToTypeID('QCSt'), charIDToTypeID('Qcsa') ); 

    var desc22 = new ActionDescriptor(); 

    desc22.putUnitDouble( charIDToTypeID('Hrzn'), charIDToTypeID('#Pxl'), 0.000000 ); 

    desc22.putUnitDouble( charIDToTypeID('Vrtc'), charIDToTypeID('#Pxl'), 0.000000 ); 

    desc21.putObject( charIDToTypeID('Ofst'), charIDToTypeID('Ofst'), desc22 ); 

    executeAction( charIDToTypeID('Plc '), desc21, DialogModes.NO ); 

}; 

JJMack