Photoshop-Skript zum Auswählen bestimmter Farben

Bitte beachten Sie, dass ich ein absoluter Anfänger bin und dies meine erste Codierungsfrage überhaupt ist. Wenn dies auf einer anderen Website angemessener ist, sagen Sie es mir.

Ich möchte einen Prozess automatisieren, bei dem das Programm eine Farbe auswählt und in eine andere ändert.

Dies ist der Code, den ich habe, dank des Skript-Listeners:

var id159 = charIDToTypeID( "ClrR" );
var desc34 = new ActionDescriptor(); 
var id160 = charIDToTypeID( "Fzns" );
desc34.putInteger( id160, 0 ); 
var id161 = charIDToTypeID( "Mnm " );
    var desc35 = new ActionDescriptor();
    var id162 = charIDToTypeID( "Rd  " );
    desc35.putDouble( id162, 0.000000 );
    var id163 = charIDToTypeID( "Grn " );
    desc35.putDouble( id163, 255.000000 );
    var id164 = charIDToTypeID( "Bl  " );
    desc35.putDouble( id164, 0.000000 );
var id165 = charIDToTypeID( "RGBC" );
desc34.putObject( id161, id165, desc35 ); 
var id166 = charIDToTypeID( "Mxm " );
    var desc36 = new ActionDescriptor();
    var id167 = charIDToTypeID( "Rd  " );
    desc36.putDouble( id167, 0.000000 );
    var id168 = charIDToTypeID( "Grn " );
    desc36.putDouble( id168, 255.000000 );
    var id169 = charIDToTypeID( "Bl  " );
    desc36.putDouble( id169, 0.000000 );
var id170 = charIDToTypeID( "RGBC" );
desc34.putObject( id166, id170, desc36 ); executeAction( id159, desc34, DialogModes.NO );

Wenn ich das in Photoshop ausführe, funktioniert es, aber da ich viele Farben auswählen muss, möchte ich es wissen

  1. Wenn es einen effizienteren Weg gibt, weniger Codezeilen zu verwenden. Es könnte entweder mit der Farbpalette oder einem anderen Werkzeug sein.
  2. Ich würde lieber Hexadezimalwerte verwenden, aber ich habe keine Ahnung, wie ich es schreiben soll. Ich habe es geschafft, es auf RGB umzustellen, aber ursprünglich wurden Lab-Farben verwendet.

In diesem Beispiel wäre das Hex 00ff00

Das könnte Ihnen helfen ... Ich habe dies vor einiger Zeit als Beispiel für jemand anderen gemacht: gist.github.com/joonaspaakko/347c270f15bc1d11efe9 - Es verwendet die Liste der oben definierten Hex-Codes, um die Vordergrundfarbe in PS zu ändern. Es schreibt eine Textdatei in denselben Ordner, in dem das Skript nachverfolgen soll, welche Farbe verwendet wurde (basierend auf der Indexnummer). Jedes Mal, wenn Sie das Skript ausführen, wählt es die nächste Farbe aus, wendet sie auf den Vordergrund an, schreibt eine neue Nummer in die temporäre Datei und macht eine Schleife, sobald Sie das Ende erreicht haben. Ich glaube, es wurde in PS CC getestet.
Sehen Sie sich das vorgeschlagene Duplikat an und lesen Sie noch einmal, was Sie gesagt haben. Ich möchte darauf hinweisen, dass es ein paar "Global Swatch Extensions" für PS gibt: ColorKit und Prisma . Wenn Sie wissen, wie globale Farbfelder in Indesign oder Illustrator funktionieren, wissen Sie, wie diese Erweiterungen funktionieren. Eine kurze Erklärung: Sie verwenden die Erweiterung, um eine Farbe auf einen Text oder eine Form anzuwenden/zu verknüpfen, und wenn Sie jemals die Farbe der Erweiterung ändern, wird sie überall dort geändert, wo diese Farbe angewendet wurde.
@Joonas Danke! Ich werde es mir bei etwas mehr Zeit mal anschauen.

Antworten (1)

Dies ist eher ein langer Kommentar als eine Antwort. Ich bin mir nicht sicher, ob die Auswahl des Farbbereichs der beste Weg ist, um die Farbe zu ersetzen, aber ja, Sie könnten dies tun.

  1. Zeilenanzahl macht Code nicht effizienter! Eine Codezeile kann durchaus weniger effizient sein als 100. Außerdem gibt es Code unter Code, also ist es nicht so, als würde Ihre Skriptsprache auf die Probe stellen. Auch die Skript-API ist von Natur aus ineffizient, wenn Sie Wert auf Geschwindigkeit legen, dann ist es an der Zeit, mit dem Schreiben von C++ zu beginnen und die Photoshop-Plugin-API zu verwenden.

    Ich nehme jedoch an, dass Sie praktischer meinen. Ja, wir können einige Funktionen definieren, um es einfacher zu lesen und zu verwenden, aufzurufen und etwas zu komprimieren. Wenn Sie es praktischer machen, wird die Länge zwar etwas länger, aber das ist für Sie nicht sinnvoll. Lassen Sie uns also den Code umgestalten:

    #target photoshop
    
    selectColorRange(
        RGBc(0.0, 255.0, 0.0),
        RGBc(0.0, 255.0, 0.0)
    );
    
    
    /******* Support functions *******/
    
    function cTID(s) { return app.charIDToTypeID(s); }
    function sTID(s) { return app.stringIDToTypeID(s); }
    
    function RGBc(r, g, b) {
        var color = new ActionDescriptor();
            color.putDouble( cTID("Rd  "), r);
            color.putDouble( cTID("Grn "), g);
            color.putDouble( cTID("Bl  "), b);   
        return color
    }
    
    function selectColorRange(color1, color2){
        var desc = new ActionDescriptor(); 
        desc.putInteger(cTID("Fzns"), 0 ); 
        desc.putObject( cTID("Mnm "), cTID("RGBC"), color1 ); 
        desc.putObject( cTID("Mxm "), cTID("RGBC"), color2 ); 
        executeAction( cTID("ClrR"), desc, DialogModes.NO );
    }
    

    Aus Ihrer Sicht lautet der Code also nur noch selectColorRange. Wenn Sie immer nur eine Farbe auswählen möchten, können Sie natürlich ändern, selectColorRangedass nur eine Eingabe erfolgt.

    Auch wenn Adobe dies als Javascipt-Funktion oder -Objekt hätte, wäre Ihr Code höchstwahrscheinlich nicht mehr als 3 Zeilen kürzer. Da Objekte sowieso bevölkert werden müssen.

  2. Nun, das ist ziemlich einfach, Sie können viele Implementierungen davon finden, indem Sie googeln. Also definieren wir eine Funktion, um dies zu tun:

    function hexC(hex) {
        // http://stackoverflow.com/questions/5623838/rgb-to-hex-and-hex-to-rgb
        hex = hex.substring(1,7)
        bigint = parseInt(hex, 16);
        var color = new ActionDescriptor()
            color.putDouble(cTID("Rd  "), (bigint >> 16) & 255);
            color.putDouble(cTID("Grn "), (bigint >> 8) & 255);
            color.putDouble(cTID("Bl  "), bigint & 255);
        return color
    }
    

    Sie würden hexC also so aufrufen,

    colorReplace(
         hexC("#00ff00"),
         hexC("#00ff00")
    );
    

    statt RGBc.

Ok, jetzt haben wir alle Teile in Ihrem Code an Ort und Stelle. Wenn Sie viele Farben haben, rufen Sie einfach eine for-Schleife auf.