Copy link to clipboard
Copied
Hi
I have a folder with hundreds of images...some in vertical (portrait) and some in horizontal orientation (landscape). I want to standardize all to vertical !!!
So after opening manually the image (or by using the Batch command) I´d need a script that does it:
1) Look at the current active image and if the image is in horizontal orientation (landscape) then rotate it 90º to become vertical (portrait)
2) If the image is already vertical then do not do anything. Leave as it.
End.
It´s just a script to identify which images are horizontal and rotate it.
The process of opening images and saving I can do manually or by using the batch Photoshop command (so I attach the script with an normal action). These taks do not need to be in the script.
Could anyone help me to write this script?
Thank you a lot
Gustavo.
// 2011, use at your own risk;
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
if (myDocument.width > myDocument.height) {
myDocument.rotateCanvas(90)
};
};
Copy link to clipboard
Copied
// 2011, use at your own risk;
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
if (myDocument.width > myDocument.height) {
myDocument.rotateCanvas(90)
};
};
Copy link to clipboard
Copied
Hi c.pfaffenbichler
That´s what I need. I inserted some more lines so it suit other of my needs.
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
if (myDocument.width < myDocument.height) {
myDocument.close()
};
else
if (myDocument.height < myDocument.width) {
myDocument.rotateCanvas(90)
};
};
Best Regards and thank you a lot again
Gustavo.
Copy link to clipboard
Copied
You can also use scripts in actions. Sometimes you may rotate an image to one landscape if its not then do some work and then rotate it back after doing the work. I have written a script that can do that. It what I call a run twice script. The first time you run it on a document it will rotate Portrait images and when it is run a secont time within the action it will rotate document it rotated back to portrait.
//////////////////////////////////////////////////////////////////////////////////
//
// Copyright 2002-2003. Adobe Systems, Incorporated. All rights reserved.
// This scripts demonstrates how to rotate a layer 90 degrees clockwise.
// Original file came from PSCS scripting\samples\javascript\RotateLayer.js
//
// Variation Copyright(c)Douglas Cody, 2004, All Rights Reserved.
//
// Updataed John J McAssey 2008 - 2009 http://mouseprints.net
//
// This script is designed to be used by a Photoshop Action twice
// A good pratice to use when creating an actions that use this scipt is for the action
// not to do a save or play some other action between its two useages of this Script.
//
// This script will look at the document orientation (portrait vs landscape)
// On the first execution, if the document is a portrait, it will be rotated
// to a horizontal.
// On the second execution, a rotated document will be
// restored to a vertical. This effectively toggles the orientation ONLY if
// the original document started out as a portrait.
//
// NOTE: Meta-data Info Instructions field is modified to hold an interim state.
//////////////////////////////////////////////////////////////////////////////////
/*
<javascriptresource>
<about>$$$/JavaScripts/orient/About=JJMack's Orient^r^rCopyright 2009 Mouseprints.^r^rRun twice script utility for action.^rNOTE:Don't play other actions between runs!^rFirst Run records orintation and rotate Protrait to Landscape^rSecond Run removes orintation recorded and rotates Portrats back.</about>
<category>JJMack's Action Run Twice Utility</category>
</javascriptresource>
*/
if (app.documents.length > 0) {
var orintation = '';
if (app.activeDocument.info.instructions.indexOf("<orient>") == -1 ) { // No Footprint
//alert("first")
var orig_ruler_units = app.preferences.rulerUnits; // Save ruler units
app.preferences.rulerUnits = Units.PIXELS; // Set ruler units to PIXELS
// Add Foot Print to metadata info instructions and rorate protrait documents
// alert( " Width = " + app.activeDocument.width + " Height = " + app.activeDocument.height );
if (app.activeDocument.width < app.activeDocument.height) { // portrait
app.activeDocument.rotateCanvas(-90.0);
app.activeDocument.info.instructions = app.activeDocument.info.instructions += "<orient>portrait</orient>";
}
else { app.activeDocument.info.instructions += "<orient>landscape or square</orient>"; } // not portrait
// Reset units to original settings
app.preferences.rulerUnits = orig_ruler_units; // Restore ruler units
}
else {
//alert("second")
// Retreive saved orintation and rotate portrait back up
orientOffset = app.activeDocument.info.instructions.indexOf("<orient>") + "<orient>".length;
orientLength = app.activeDocument.info.instructions.indexOf("</orient>") -orientOffset;
orintation = app.activeDocument.info.instructions.substr(orientOffset, orientLength);
if ( orintation == "portrait" ) { app.activeDocument.rotateCanvas(90.0); }
// Remove footprint from metadata info instructions
before = app.activeDocument.info.instructions.substr(0,app.activeDocument.info.instructions.indexOf("<orient>"));
afterOffset = app.activeDocument.info.instructions.indexOf("</orient>") + "</orient>".length;
after = app.activeDocument.info.instructions.substr(afterOffset, app.activeDocument.info.instructions.length - afterOffset);
app.activeDocument.info.instructions = before + after;
}
}
else { alert("You must have at least one open document to run this script!"); }
There are 12 script I have written to be used in Actions in my
Crafting Actions Package
Copy link to clipboard
Copied
Hi JJMark
Wow thank you a lot for the immense help. It will be very useful...
Let me ask one more thing? Is it possible to write this kind of script:
I´m needing a script that does it:
If the image is horizontal (landscape) then run the action called "Action X" that is in the set "My folder" in the Actions panel.
If the image is vertical (portrait) then run the action called "Action Y" that´s in the set "My folder" in the Actions panel.
End.
Sure "Action X", "Action Y" and "My folder" are variables that I´ll change in the script.
I want it because I want to run a Batch Photoshop command to a folder with lot´s of images. So I record this script in an base action for the batch. And then batch can run different actions based on the orientation of the document.
Thank you very much.
Gustavo.
Copy link to clipboard
Copied
Like Actions can use scripts, scripts can use actions. For example the Image Processor script let you specify scripts to include in its processing. Scripts may or may not have dialogs. Scripts can also be Photoshop plug-in like Fit Image. A Plug-in script can record variables into action when the action is being recorded and the plug-in is used. Action are easy to record and Photoshop Plug-in Scriptlistner can record script code but like Actions this script code just step step step (Action Manager code) no logic, however logic can be added and functions can be made from the recorded script code. Both Scripts an Actions have limits neither can automate thing like brush strokes.
I can not type or spell and don't know javascript or object programming. I'm a fearless hacker.
Though Scripting is more power then Action I use actions more because recording them is so easy to do. However unlike most Action creators I have a programming background and carefully craft most of my actions. Most who record actions do not and they have no problem with their actions for they created them for their work-flow, know how the work and when to use their actions. These action may not work well for others for they may have a different kind of work-flow they don't know how the action works and don't know when to use them. Many actions have built in dependencies they may select layers by name a select layers they did not create. Also Layer names need not be unique so a wrong layer may get select or a layer may not exist. Many this can go wrong in both Actions and Script Scripts can catch errors and do something else.
Download my package read both the text file and the short utilities scripts skip reading the larger scripts in the package.
Copy link to clipboard
Copied
Hi JJMack
I tried some codes and finally got it yesterday. Here´s what I was looking for:
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
if (myDocument.width > myDocument.height) {
myDocument = doAction ("H1", "Actions")
};
else
if (myDocument.width < myDocument.height) {
myDocument = doAction ("H2", "Action")
};
};
That´s it
I´m very happy I was sucessful
Best Regards, merry christmas !!!
Gustavo.
Copy link to clipboard
Copied
You didn't handle the case where width == height. (which will let some square images through without processing)
Copy link to clipboard
Copied
That could well be what he wants. He could of course add a third if if he want to do a do somthing special for a 1:1 aspect ratio case. He may be using the adtions H1 and H2 to use canvas size to crop the document to a 1:1 aspect ratio using the heigh for landscape and width for protrait documents. The code does not let some square images through without processing it lets all square image through.
Copy link to clipboard
Copied
I think Chris Cox was right in pointing out the gap in the script logic. Even if the OP meant to skip square image( which I doubt ), others read these threads and use the snippets posted. I would have pointed out that because an image can't be both landscape and portrait that only the else or second if statement is needed, not both. If he just had one if statement to handle portrait and one to handle landscape it would be clearer that square images were meant to be skipped.
And I understand what he meant by 'some square images'. If the width is within a few pixels of the height it still looks square even if it doesn't pass the width == height test.
Copy link to clipboard
Copied
Michael I think your reading to much between the lines. I did not write anything to infer Chris was wrong in pointing out that square images will fall through. To me the code looks like its designed to do that. The original question seemed to be Landscape or Portrait this could be done with a single If statement which would cause square image fall into else clause putting Square into the Landscape or Portrait category depending oh the if. Image that are not square but are close to being square and look square still will be processed by action H1 or H2 by the code shown. Though the code looks like that to me. Chris was perfectly correct in making the append for new programmers often make that type of error. Heck I not that new to programming and have made that type of error. One learns from making errors. I've made so many errors I must have learned a lot unfortunately I think I have forgotten more then I ever learned.
Copy link to clipboard
Copied
Hi Chris, JJMack and Michael
Thank you a lot for the insight. I´m very beginner on programming JavaScript. At true that code to differ horizontal and vertical actions suits perfectly my needs because the photos I was intended to process was originated from a digital camera (so no image file is square, has the exactely width and height size).
But you are true Chris. The code should have an "if" for squares. It´s a gap in the script !!!!! Thank you. I assume I have not thought about this.
Well...would be the code like it:
#target photoshop
if (app.documents.length > 0) {
var myDocument = app.activeDocument;
if (myDocument.width > myDocument.height) {
myDocument = doAction ("H1", "Actions")
};
else
if (myDocument.width < myDocument.height) {
myDocument = doAction ("H2", "Actions")
};
else
if (myDocument.width == myDocument.height) {
myDocument = doAction ("H3", "Actions")
{
};
Please fell free correcting the code if it´s wrong !!
Best Regards
Gustavo.
Copy link to clipboard
Copied
I'm using Apple Script Editor to save the below script. How do I save the script for photoshop 2022? I'm don't see jsx?
var doc = activeDocument;
if(doc.width.value>doc.height.value){//Landscape
doAction("Landscape", "Photos");
}else{//Portrait
doAction("Portrait", "Photos");
}
Copy link to clipboard
Copied
Don't use that editor but maxOS text editor with plain text.
Copy link to clipboard
Copied
Thank you. That worked. I use this script when photoshop opens a jpg image file and then saves ot as a psd. Another issue I'm having is the script runs everytime I open the same photo in photoshop. I need to only run the script on jpgs and not psd files. Any thoughts?
Copy link to clipboard
Copied
if (/jpg$/i.test(activeDocument.name)) {
/*your code*/
}
Copy link to clipboard
Copied
Thank you. So it would be
if (/jpg$/i.test(activeDocument.name))
{/*var doc = activeDocument;
if(doc.width.value>doc.height.value){//Landscape
doAction("Landscape", "OTS Photos");
}else{//Portrait
doAction("Portrait", "OTS Photos");*/}
Copy link to clipboard
Copied
Copy link to clipboard
Copied
Remove /**/ part from the code.
Copy link to clipboard
Copied
so it should look like this? I'm still having problems.
if (/jpg$/i.test(activeDocument.name)) {
var doc = activeDocument;
if(doc.width.value>doc.height.value){//Landscape
doAction("Landscape", "OTS Photos");
}else{//Portrait
doAction("Portrait", "OTS Photos");
}
Copy link to clipboard
Copied
@otsphotos – You were missing a closing bracket at the end:
if (/jpg$/i.test(activeDocument.name)) {
var doc = activeDocument;
if (doc.width.value > doc.height.value) { //Landscape
doAction("Landscape", "OTS Photos");
} else { //Portrait
doAction("Portrait", "OTS Photos");
}
}
Copy link to clipboard
Copied
Copy link to clipboard
Copied
I have tested all three scripts, in isolation and also with the Script Events Manager Open Event and all three work as expected.
Please use the following button in the forum reply toolbar when posting code:
</>
Copy link to clipboard
Copied
thank you
Copy link to clipboard
Copied
He most likely answers via E-Mail.