Difference between revisions of "Photoshop Javascript"
Jump to navigation
Jump to search
m |
m |
||
| Line 3: | Line 3: | ||
If you want an old overview here's a tutorial I wrote a thousand years ago on scripting in Photoshop: <s>https://www.kirupa.com/motiongraphics/ps_scripting.htm</s> http://mlkdesign.online.fr/tutorials/scripting/scripting1.html | If you want an old overview here's a tutorial I wrote a thousand years ago on scripting in Photoshop: <s>https://www.kirupa.com/motiongraphics/ps_scripting.htm</s> http://mlkdesign.online.fr/tutorials/scripting/scripting1.html | ||
===Run Actions according to folder names (wip)=== | |||
Hadn't coded PS for a while goddam it's ugly. Some code stolen from the web, can't remember who to credit, sorry. | |||
<pre> | |||
function getActionSets() { | |||
cTID = function(s) { return app.charIDToTypeID(s); }; | |||
sTID = function(s) { return app.stringIDToTypeID(s); }; | |||
var i = 1; | |||
var sets = []; | |||
while (true) { | |||
var ref = new ActionReference(); | |||
ref.putIndex(cTID("ASet"), i); | |||
var desc; | |||
var lvl = $.level; | |||
$.level = 0; | |||
try { | |||
desc = executeActionGet(ref); | |||
} catch (e) { | |||
break; | |||
} finally { | |||
$.level = lvl; | |||
} | |||
if (desc.hasKey(cTID("Nm "))) { | |||
var set = {}; | |||
set.index = i; | |||
set.name = desc.getString(cTID("Nm ")); | |||
set.toString = function() { return this.name; }; | |||
set.count = desc.getInteger(cTID("NmbC")); | |||
set.actions = []; | |||
for (var j = 1; j <= set.count; j++) { | |||
var ref = new ActionReference(); | |||
ref.putIndex(cTID('Actn'), j); | |||
ref.putIndex(cTID('ASet'), set.index); | |||
var adesc = executeActionGet(ref); | |||
var actName = adesc.getString(cTID('Nm ')); | |||
set.actions.push(actName); | |||
} | |||
sets.push(set); | |||
} | |||
i++; | |||
} | |||
return sets; | |||
}; | |||
function getActions(aset) { | |||
cTID = function(s) { return app.charIDToTypeID(s); }; | |||
sTID = function(s) { return app.stringIDToTypeID(s); }; | |||
var i = 1; | |||
var names = []; | |||
if (!aset) { | |||
throw "Action set must be specified"; | |||
} | |||
while (true) { | |||
var ref = new ActionReference(); | |||
ref.putIndex(cTID("ASet"), i); | |||
var desc; | |||
try { | |||
desc = executeActionGet(ref); | |||
} catch (e) { | |||
break; | |||
} | |||
if (desc.hasKey(cTID("Nm "))) { | |||
var name = desc.getString(cTID("Nm ")); | |||
if (name == aset) { | |||
var count = desc.getInteger(cTID("NmbC")); | |||
var names = []; | |||
for (var j = 1; j <= count; j++) { | |||
var ref = new ActionReference(); | |||
ref.putIndex(cTID('Actn'), j); | |||
ref.putIndex(cTID('ASet'), i); | |||
var adesc = executeActionGet(ref); | |||
var actName = adesc.getString(cTID('Nm ')); | |||
names.push(actName); | |||
} | |||
break; | |||
} | |||
} | |||
i++; | |||
} | |||
return names; | |||
}; | |||
allActions = []; | |||
actionSets = getActionSets(); | |||
for(set in actionSets){ | |||
allActions.push(getActions(actionSets[set])); | |||
} | |||
alert(allActions) | |||
var folder = Folder.selectDialog("Folder To Process") | |||
//AL = new ActionList(); | |||
//alert(AL.getList()) | |||
loop = 1 | |||
while(loop == 1){ | |||
files = folder.getFiles(); | |||
for(item in files){ | |||
if (files[item] instanceof File ){ | |||
if(files[item].name.indexOf("kill") != -1){ | |||
loop = 0; | |||
} | |||
}else{ | |||
//is folder | |||
folderName = files[item].name | |||
alert(folderName) | |||
app.doAction( folderName ,'bernie'); | |||
} | |||
} | |||
} | |||
</pre> | |||
===Launch an action using the name of the current document=== | ===Launch an action using the name of the current document=== | ||
Save as .jsx and launch from File>Script in photoshop | Save as .jsx and launch from File>Script in photoshop | ||
Revision as of 18:59, 16 April 2024
This is not updated frequently! I rarely use photoshop and even less script it.
If you want an old overview here's a tutorial I wrote a thousand years ago on scripting in Photoshop: https://www.kirupa.com/motiongraphics/ps_scripting.htm http://mlkdesign.online.fr/tutorials/scripting/scripting1.html
Run Actions according to folder names (wip)
Hadn't coded PS for a while goddam it's ugly. Some code stolen from the web, can't remember who to credit, sorry.
function getActionSets() {
cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };
var i = 1;
var sets = [];
while (true) {
var ref = new ActionReference();
ref.putIndex(cTID("ASet"), i);
var desc;
var lvl = $.level;
$.level = 0;
try {
desc = executeActionGet(ref);
} catch (e) {
break;
} finally {
$.level = lvl;
}
if (desc.hasKey(cTID("Nm "))) {
var set = {};
set.index = i;
set.name = desc.getString(cTID("Nm "));
set.toString = function() { return this.name; };
set.count = desc.getInteger(cTID("NmbC"));
set.actions = [];
for (var j = 1; j <= set.count; j++) {
var ref = new ActionReference();
ref.putIndex(cTID('Actn'), j);
ref.putIndex(cTID('ASet'), set.index);
var adesc = executeActionGet(ref);
var actName = adesc.getString(cTID('Nm '));
set.actions.push(actName);
}
sets.push(set);
}
i++;
}
return sets;
};
function getActions(aset) {
cTID = function(s) { return app.charIDToTypeID(s); };
sTID = function(s) { return app.stringIDToTypeID(s); };
var i = 1;
var names = [];
if (!aset) {
throw "Action set must be specified";
}
while (true) {
var ref = new ActionReference();
ref.putIndex(cTID("ASet"), i);
var desc;
try {
desc = executeActionGet(ref);
} catch (e) {
break;
}
if (desc.hasKey(cTID("Nm "))) {
var name = desc.getString(cTID("Nm "));
if (name == aset) {
var count = desc.getInteger(cTID("NmbC"));
var names = [];
for (var j = 1; j <= count; j++) {
var ref = new ActionReference();
ref.putIndex(cTID('Actn'), j);
ref.putIndex(cTID('ASet'), i);
var adesc = executeActionGet(ref);
var actName = adesc.getString(cTID('Nm '));
names.push(actName);
}
break;
}
}
i++;
}
return names;
};
allActions = [];
actionSets = getActionSets();
for(set in actionSets){
allActions.push(getActions(actionSets[set]));
}
alert(allActions)
var folder = Folder.selectDialog("Folder To Process")
//AL = new ActionList();
//alert(AL.getList())
loop = 1
while(loop == 1){
files = folder.getFiles();
for(item in files){
if (files[item] instanceof File ){
if(files[item].name.indexOf("kill") != -1){
loop = 0;
}
}else{
//is folder
folderName = files[item].name
alert(folderName)
app.doAction( folderName ,'bernie');
}
}
}
Launch an action using the name of the current document
Save as .jsx and launch from File>Script in photoshop
/* An example of how you can use the name of a document to launch an action that shares the same name
try it on an image called 'Gradient Map.jpg' -- since 'Gradient Map is a default action in the 'Default Actions' set it should work on a brand new photoshop
*/
//this gets the name of the current open (foremost document)
currentImage = app.activeDocument.name ;
//this removes the extension
currentImageName = currentImage.substring(0, currentImage.lastIndexOf('.')) || currentImage ;
//this calls an action with the name of the current image from the 'Default Actions' set (which you can of course change)
app.doAction( currentImageName ,'Default Actions');
All documents to current document
docs = app.documents;
ad= app.activeDocument;
for(i = 0;i<docs.length;i++){
if(docs[i]!=ad){
activeDocument = docs[i];
docs[i].selectAll;
docs[i].layers[0].copy();
activeDocument = ad;
ad.paste();
}
}
while(docs.length>1){
//hackish but works
for(i = 0;i<docs.length;i++){
if(docs[i]!=ad){
docs[i].close(SaveOptions.DONOTSAVECHANGES);
}
}
}
Incremental Save
// incrementalsave
//
// checks if there is a double underscore in filename, if not adds them starting at 0001
// else increments and saves as 24bit png (filename__####.png) in the doc's folder
//
//
// feel free to use & modify - mbernadat@gmail.com
//
//
// only tested on vista+cs3
function remEx(f) {
extPeriod = f.lastIndexOf(".");
if(extPeriod > 0){
return f.substr(0,extPeriod);
}else{
return false;
}
}
function getIncrPos(nameWithoutExt){
pos = nameWithoutExt.lastIndexOf("__");
return nameWithoutExt.substr(pos+2,nameWithoutExt.length);
}
function basenameKindOf(path,match) {
a = path.lastIndexOf(match);
if(a > 0){;
return path.substr(a,path.length);
}else{
return false;
}
}
function addZeros(number){
if(number<10){
number = "000"+number;
}else if(number<100){
number = "00"+number;
}else if(number<1000){
number = "0"+number;
}
return number;
}
docP = app.activeDocument.path;
docN = remEx(app.activeDocument.name);
docFold = new Folder (app.activeDocument.path);
files = docFold.getFiles(docN+"__*.png");
files = Folder.decode(files);
if(files.length == 0){
numbering = 0;
}else{
files = files.split(",");
numbering = 0;
for(var i in files){
curNumb = getIncrPos(remEx(basenameKindOf(files[i],docN)));
numbering = Math.max(numbering,curNumb);
//alert("'"+remEx(files[i])+"'");
}
}
numbering++;
numbering = addZeros(numbering);
var exportOptions = new PNGSaveOptions();
//var type = ExportType.PNG24;
var fileSpec = new File(docP+"/"+docN+"__"+numbering+".png");
exportOptions.antiAliasing = true;
exportOptions.transparency = true;
exportOptions.saveAsHTML = false;
app.activeDocument.saveAs(fileSpec,exportOptions,1,Extension.LOWERCASE);