You are currently browsing the phreekz posts tagged: jsx


Photoshop Scripting II – automatisches Keying

Diese Frage wird recht oft gestellt : Das automatische Freistellen mehrerer Bilder/Objekte. Also, hier das zugehörige Script, welches einfach nur den Farbwert an Pixelstelle 10/10 ausliest und in einer Javascript-Alert-Box anzeigt.

getColor.jsx

#target photoshop
var docAktuell = app.activeDocument;

var pixelLoc = [UnitValue("10 pixels") , UnitValue("10 pixels")];
var colorSamplerRef = docAktuell.colorSamplers.add(pixelLoc);
var currentColor = colorSamplerRef.color;

var redVal = Math.round(currentColor.rgb.red);
var greenVal = Math.round(currentColor.rgb.green);
var blueVal = Math.round(currentColor.rgb.blue);

alert("Pixel [10, 10] = (" + redVal + ", " + greenVal + ", " + blueVal + ")");

Scripts werden grundsätzlich in ./Photoshop/Presets/Scripts/ abgelegt und sind dann in Photoshop unter Script erreichbar. Übrigens, es gibt ein tolles Forum dafür : http://www.ps-scripts.com/bb/index.php – Leider ist da nicht soviel los, Scripting ist halt nicht Jedermanns Sache.

Hier also eine Minimalversion eines Photoshopscripts, dass in einer Datei 4 Selections in den Ecken nimmt, per Similar eine Keyingauswahl erstellt und diese in einer Maske speichert.

AutoKeyer.jsx

#target photoshop
var docAktuell = app.activeDocument;
var maxX = docAktuell.width;
var maxY = docAktuell.height;

//change backgroundlayer to worklayer
if(docAktuell.layers[0].isBackgroundLayer==true){
docAktuell.layers[0].isBackgroundLayer=false;
}

// makeLayerMask function - done by Paul Riggott
// http://forums.adobe.com/thread/290125
function makeLayerMask(maskType) {
if( maskType == undefined) maskType = 'RvlS' ; //from selection
var desc140 = new ActionDescriptor();
desc140.putClass( charIDToTypeID('Nw  '), charIDToTypeID('Chnl') );
var ref51 = new ActionReference();
ref51.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID('Msk ') );
desc140.putReference( charIDToTypeID('At  '), ref51 );
desc140.putEnumerated( charIDToTypeID('Usng'), charIDToTypeID('UsrM'), charIDToTypeID(maskType) );
executeAction( charIDToTypeID('Mk  '), desc140, DialogModes.NO );
}

// change Rulerunits to px
var strtRulerUnits = app.preferences.rulerUnits;
app.preferences.rulerUnits = Units.PIXELS;

// 4 Corner rectangled Selections
docAktuell.selection.select(new Array (new Array(10,10),new Array(20,10), new Array(20,20), new Array(10,20)),SelectionType.REPLACE, 1, false);
docAktuell.selection.select(new Array (new Array(maxX-10,10),new Array(maxX-20,10), new Array(maxX-20,20), new Array(maxX-10,20)),SelectionType.EXTEND, 1, false);
docAktuell.selection.select(new Array (new Array(maxX-10,maxY-10),new Array(maxX-20,maxY-10), new Array(maxX-20,maxY-20), new Array(maxX-10,maxY-20)),SelectionType.EXTEND, 1, false);
docAktuell.selection.select(new Array (new Array(10,maxY-10),new Array(20,maxY-10), new Array(20,maxY-20), new Array(10,maxY-20)),SelectionType.EXTEND, 1, false);

// Grab all pix similar to the selection
docAktuell.selection.similar(60,10);

// change the selection a bit
var Selected = app.activeDocument.selection;
Selected.expand( 0.2 );
//Selected.contract( 5 );
Selected.feather( 0.2 );

//make a mask from it
makeLayerMask('HdSl');

//done ! thx by phreekz.chmee

Wieder mal die wichtige Info, dass keine Fehler abgefangen werden. Ich habe das Script mal mit diesem Bild ausprobiert, mit Diesem und auch mit diesem Hier . Sieht erstmal gut aus. Im Script sind die Variablen recht gut einsehbar, zB im Similar Bereich die Werte für Toleranz (60) und Antialiasing (10), danach auch noch Variablen, um die Selektion zu verbessern, Expand und Feather.

Wenn man am Scripting Gefallen findet, sollte man mit diesem Tutorial weitermachen.

mfg chmee

Photoshop Scripting in JSX

Scripting für Photoshop
Wenn man besondere Wege braucht, Photoshop es so nicht unterstützt oder wiederkehrende Arbeitsschritte in der Aktion nicht sinnvoll umgesetzt werden können, dann greift man zur ultramächtigen Scripting-Engine von Adobe. Das Schöne ist, die Scripts können komplette Arbeitsschritte sein, können aber auch Teilaufgaben in Aktionen ausführen. Hier werden nach und nach meine Scripts erscheinen.

Wie kann ich sie benutzen ?
Man kopiert den Code aus dem Codebereich und speichert ihn mittels eines simplen Texteditors in eine Datei, benennt sie dementsprechend (Endung . jsx) und kopiert jene in den Presets/Scripts-Ordner. Nach einem Neustart von Photoshop findet man den Eintrag in Datei/File->Scripts.

Vorsicht!
Ich fange keine Fehler in meinen Scripten ab, vorteilhaft ist dadurch die Kürze, nachteilig ist aber, dass man Fehler, wenn sie auftreten nicht erkennt. Zudem ist Jeder, der diese Scripts benutzt, für seine Daten selbst verantwortlich, also immer erst testen und selbst entscheiden, ob alles glatt läuft.

SaveAsTIF
Ganz einfaches Script, das von der aktuell geöffneten Datei eine TIF-Kopie im gleichen Ordner speichert. Man fragt sich, wozu so etwas ? Grundsätzlich geht es um den Einsatz in einer Aktion oder Batch, wo bei normalem Einsatz der “Speichern unter..”-Funktion dem Namen -Kopie anhängt UND der Speicherort fixiert bleibt ( Der Ordner, der beim Aktion-Erstellen benutzt wurde ). Das Bild sollte vor dieser Scriptaktion auf eine Ebene zusammengelegt sein!

Da das Script sehr einfach und kurz ist, kann man es recht schnell an eigene Bedürfnisse anpassen.

Script – SaveAsTIF.jsx

#target photoshop

var DokAktuell = app.activeDocument;
var DokFilename = DokAktuell.name;
var DokBasename = DokFilename.match(/(.*)\.[^\.]+$/)[1];
var DokPfad = DokAktuell.path;

var tiffSaveOptions = new TiffSaveOptions();
tiffSaveOptions.embedColorProfile = true;
tiffSaveOptions.imageCompression = TIFFEncoding.NONE;

DokAktuell.saveAs((new File(DokPfad+"/"+DokBasename+".tif")), tiffSaveOptions, false);