Copy link to clipboard
Copied
Hi! I am in Photoshop now and would like to make an script for placing watermarks so that they take up 10% of the width of the image and are placed so that they are 3% in from the left and 3% from the bottom on the canvas. How do I do this?
Copy link to clipboard
Copied
It should be easy to modify the script I have posted it places the watermark on the bottom right not the left. You would need to change the last transform..
#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
placeWatermark(logoFile, LogoSize, LogoMargin); // Place Watermark into the bottom right of 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;
}
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);
var LayerHeight = (SB[3].value - SB[1].value);
marginSize = Margin/100*doc.height.value; // move resized watermark into the document lower right corner with some margin
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 );
};
Copy link to clipboard
Copied
Do you know if I could use a psd or ai file instead of the png so that it will come in with layers?
Copy link to clipboard
Copied
You can use any image file type you want the watermark layer will be a single smart object layer. The Laye embedded object can be a layered file like PSD , PSB or TIFF. If it is you can open the embedded object is Photoshop. The disadvantage is the Layered embedded file will be larger then a flat file like png. This will just make your watermark layered image file size larger than need. IMO the no good reason to have a layered smart object. You can of still have your Logo master file a layer file to make ir easy to update. IMO you should save a png file as well as your PSD and watermark using the PNG file not the layered file.
Copy link to clipboard
Copied
Is there a way of modifying this script so that it embeds the smart object after placing it?
Thanks!
Mat
Copy link to clipboard
Copied
The way place works is it uses your file full resolution to render Pixels for you new Photoshop layer. By default Place will create a smart object layer. The layes's object will either contain a copy of your file or a link to your file. The rendered layer pixels can not be changed with Photoshop tools like paint brush, erases etc. There composite can be adjusted via smart filters. Also every Smart Object layer has an associated transform. To scale and position the layer composite in you document. Any time you change a smart object layers transform. The transform is transforming the Pixels rendered for the layer. These pixels can not be changed by Photoshop tools. The only want to change these is to open the layers object and modifying the object. When you update the object Photoshop will render a new set of Pixels for the updated object.
The way the script is coded your full size file is embedded in the layers object. You would need to change the script if you want the layer to have a linked master watermark file which make not sense if you will be saving files for the web. They are not layered and contain no objects..
Copy link to clipboard
Copied
Oh okay. I assumed the file was added as a linked smart object that could be broken. One more question: I can't seem to figure out how to make the logo show up on the bottom left rather than bottom right. Is there a line of code I need to modify or add?
Also, how easy is it to alter this script to work in Illustrator? A completely new script?
Thanks!
Mat
Copy link to clipboard
Copied
I posted two version of the script here is a link to the one you want. Right click the link and] save the script. The formatting should look better; You change the statement
var BottomLetf = false// false = Bottom Right true Bottom Left
Looks like Jive has changed again you man nee to uset the link and then right click save as in the page..
http://www.mouseprints.net/old/dpr/PlaceWatermark.jsx
Copy link to clipboard
Copied
Thanks!
Copy link to clipboard
Copied
As far as Illustrator, you would need to write a new script. They're not interchangeable.
Copy link to clipboard
Copied
I do not use Illustrator one complex Adobe application is all I want.
If you use Illustrator I would expect that you would create your Watermark using all vector graphics in Illustrator and use that File as placed vector smart object in Photoshop. Photoshop treats placed .AI and .SVG file as vector smart object to a point. I find that Rotation and perspective transforming is not supported with these vector smart objects. I only hack a scripting Photoshop.
I don't use the bridge much so I doe not try scripting the Bridge. If you are automating an application via a script. The script would need to be programmed for the application being automated. Illustrator is Adobe Vector editing application. Photoshop supports some vector tools but is basically a pixels editor.
I have read that Photoshop Pen tool is different then Illustrator's Pen tool.
I do not even load Lightroom for I do not particulary want two RAW UI and a lightroom user need to use ACR UI in Photoshop and Lightrool RAW conversion are open into Photoshop through ACR for Lightroom Develope module is not also a Plug-in like ACR. Several Adobe Applications use ACR however Lightroom does not. Lightroom user ACR in Photoshop and Lightroon can noy use Layers. Only a composite layer can be use from Photoshop in lightroom so when you edit a document from lightroom in Photoshop Lightroom can no longer readjust its RAW conversion for conversion has been merged into the Photoshop's edits.... So I do not install Lightroom to keep things simple.
Change is not always better IMO.
Copy link to clipboard
Copied
Hi Mack, I just tested the script and it works perfectly thank you so much for the support.
one question, is there an option to target a folder full of images instead of one open file ? i want to batch watermark using this script.
thanks.
Copy link to clipboard
Copied
If you can't script this, the easiest way would be to record the execution of the Script into an Action, then use the Batch command or to use Image Processor or Image Processor Pro scripts referencing the action.
Copy link to clipboard
Copied
It works great .. But when I modified the location , I got this error TypeError: undefined is not an object: on line 55 ... ?!
#target photoshop;
app.bringToFront();
var logoFile = "/Users/obaial-ranis/Desktop/٢٢.psd"; // Watermark file should be large for resize down works better than up
var LogoSize = 20 ; // percent of document height to resize Watermark to
var LogoMargin = 0; // percent of Document height the Watermark should have as a margin
placeWatermark(logoFile, LogoSize, LogoMargin); // Place Watermark into the bottom right of 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;
}
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,-SB[5].value,-SB[3].value); // Move resized layer to top left canvas corner
var LayerWidth = (SB[2].value - SB[0].value);
var LayerHeight = (SB[3].value - SB[1].value);
marginSize = Margin/100*doc.height.value; // move resized watermark into the document lower right corner with some margin
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 );
};
Copy link to clipboard
Copied
What do you think this line does?
activeDocument.activeLayer.translate(-SB[0].value,-SB[1].value,-SB[5].value,-SB[3].value); // Move resized layer to top left canvas corner
You've made changes here. Explain them.
Copy link to clipboard
Copied
Move the logo to the upper left
Copy link to clipboard
Copied
In the original code, the translate function has only two parameters at this point. It does what you just wanted. Why did you add two more parameters? Moreover, the SB[5] parameter is undefined, since the array has only four elements. This is what causes the error. Return the code as in the original post.