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

6 Kommentare

  1. chmee

    Ach ja, das Script arbeitet über Similar, nicht über die MagicWandTools.

  2. Andy

    Hey chmee,
    sehr guter Beitrag! Daumen hoch.
    Kannst du mir evtl. weiter helfen ? ich möchte in einem Bild nach dem hellest Punkt suchen. Nun kenne ich die Funktion nicht die die gesetzte Messpunkte wieder löscht. Da man nur maximal 10 setzten kann:( ?

    Vllt hast du eine Idee wie man es anders machen könnt e?

  3. chmee

    hmm. ad hoc: Die simple Methode wäre, das Bild per x/y-Schleifen durchzulaufen und nach der maximalen Helligkeit zu suchen (wobei maximale Helligkeit bei RGB unterschiedlich betrachtbar ist, ein Layer? Alle Layer addiert? Luma per YUV-Umrechnung?) Ich würde danach noch einmal den gefundenen Wert mit „Similar“ (oben) und ner geringen Toleranz benutzen und wiedermals absuchen lassen. Dann hast Du ne Selektion der hellsten Punkte.

    Man könnte sicherlich auch ne Auswahl erstellen anhand des Tonwertdiagramms (Maximalwerte ausgeben und dann selektieren lassen)

    p.s.: Die erste Idee ist so ne Holzhammermethode, ich bin mir sicher, dass Photoshop da was in petto hat.

  4. Andy

    Also es ist ein Bild, ich habe an LAB gedacht da bei dem ersten Wert die Helligkeit in % angezeigt wird. Ja die erste Methode wäre denke ich mal ausreichend nur da Problem es sind maximal nur 10 Messpunkte erlaubt. Man müsste also die nach jedem 10 Durchlauf löschen um weiter zu messen. Oder gibt es eine andere Möglichkeit die Farbe in LAB Modus für jeden Pixel auszulesen und im Array abzuspeichern ?

  5. chmee

    Wozu diese 10 Messpunkte? Die Abfrage wäre von der Idee:

    max=0
    maxpunkt =(0,0)

    For x = 0 to Breite
    ..For y = 0 to Höhe
    ….if Luma(x,y)>max
    ……max = farbe(x,y)
    ……maxpunkt = (x,y)

    Max Helligkeit = max
    Position = maxpunkt(x,y)

    Und natürlich kannst Du es auch im Lab-Raum machen, dann entfällt die Umrechnung Luma(RGB->YUV).

Schreibe einen Kommentar

Deine eMailadresse wird nicht veröffentlicht.