Wie erstelle ich eine Swatch-Bibliothek aus einer Json-Datei?

Ich suche nach einer Möglichkeit, eine Farbfeldbibliothek aus einer JSON-Datei in Adobe Photoshop CS6 zu generieren. Leider kann ich im Web nichts darüber finden und ich weiß nicht, wie ich mein eigenes Plugin/Skript schreiben soll, das dies für mich erledigt.

Wenn es ein kostenloses Skript / Plugin gibt, das dies tut, können Sie mir bitte den Link senden. Wenn nichts vorhanden ist, können Sie mich an einen Ort verweisen, an dem ich eine Vorlage für ein Photoshop CS6-Skript und einen Beispielcode finden kann, der ein Farbfeld aus einem bestimmten Namen und RGB-Werten erstellen kann?

Wie sieht der JSON aus?

Antworten (1)

Eine alte Frage, aber vielleicht hilft dies jemandem. Das Erstellen von Skripten auf einer grundlegenden Ebene ist in Photshop sehr einfach und besteht normalerweise aus mehreren Schritten:

  • Wenn Sie keine Ahnung von Javascript haben, besuchen Sie die Code Academy, udemy oder eine andere Seite, die Ihnen gefällt, und lernen grundlegende Dinge wie Variablen, Arrays und Funktionen – das dauert nur wenige Stunden;
  • Sie laden das Plug-in ScriptingListener herunter und installieren es . Dieses Plugin zeichnet die meisten Dinge, die in Photoshop passieren, als Javascript-Code auf, der hässlich aussieht, aber wen interessiert das;
  • Sie googlen die Dinge, die Sie nicht verstehen oder nicht wissen (z. B. wie man eine json-Datei liest) – Javascript ist sehr beliebt, wenn Sie etwas tun möchten, gab es Tausende von Menschen, die dasselbe versucht haben;
  • Sie packen das alles in ein Skript.

Zum Beispiel. Wenn ich ein neues Farbfeld erstelle, zeichnet ScriptingListener diesen Code in einer Protokolldatei auf dem Desktop auf:

// =======================================================
var idMk = charIDToTypeID( "Mk  " );
    var desc4 = new ActionDescriptor();
    var idnull = charIDToTypeID( "null" );
        var ref1 = new ActionReference();
        var idClrs = charIDToTypeID( "Clrs" );
        ref1.putClass( idClrs );
    desc4.putReference( idnull, ref1 );
    var idUsng = charIDToTypeID( "Usng" );
        var desc5 = new ActionDescriptor();
        var idNm = charIDToTypeID( "Nm  " );
        desc5.putString( idNm, "my swatch" );
        var idClr = charIDToTypeID( "Clr " );
            var desc6 = new ActionDescriptor();
            var idRd = charIDToTypeID( "Rd  " );
            desc6.putDouble( idRd, 62.000000 );
            var idGrn = charIDToTypeID( "Grn " );
            desc6.putDouble( idGrn, 62.000000 );
            var idBl = charIDToTypeID( "Bl  " );
            desc6.putDouble( idBl, 62.000000 );
        var idRGBC = charIDToTypeID( "RGBC" );
        desc5.putObject( idClr, idRGBC, desc6 );
    var idClrs = charIDToTypeID( "Clrs" );
    desc4.putObject( idUsng, idClrs, desc5 );
    var idpushToDesignLibraries = stringIDToTypeID( "pushToDesignLibraries" );
    desc4.putBoolean( idpushToDesignLibraries, false );
executeAction( idMk, desc4, DialogModes.NO );

Obwohl es sehr schwer zu lesen ist, können Sie sehen, dass es drei Werte für RGB-Farben und ein Namensfeld mit einer my swatchZeichenfolge gibt. Also kann ich das in eine Funktion packen und es vergessen:

function createNewSwatch(name, red, green, blue)
{
  // =======================================================
  var idMk = charIDToTypeID("Mk  ");
  var desc4 = new ActionDescriptor();
  var idnull = charIDToTypeID("null");
  var ref1 = new ActionReference();
  var idClrs = charIDToTypeID("Clrs");
  ref1.putClass(idClrs);
  desc4.putReference(idnull, ref1);
  var idUsng = charIDToTypeID("Usng");
  var desc5 = new ActionDescriptor();
  var idNm = charIDToTypeID("Nm  ");
  desc5.putString(idNm, name); // here goes a name property
  var idClr = charIDToTypeID("Clr ");
  var desc6 = new ActionDescriptor();
  var idRd = charIDToTypeID("Rd  ");
  desc6.putDouble(idRd, red); // red goes here
  var idGrn = charIDToTypeID("Grn ");
  desc6.putDouble(idGrn, green); // green goes here
  var idBl = charIDToTypeID("Bl  ");
  desc6.putDouble(idBl, blue); // blue goes here
  var idRGBC = charIDToTypeID("RGBC");
  desc5.putObject(idClr, idRGBC, desc6);
  var idClrs = charIDToTypeID("Clrs");
  desc4.putObject(idUsng, idClrs, desc5);
  var idpushToDesignLibraries = stringIDToTypeID("pushToDesignLibraries");
  desc4.putBoolean(idpushToDesignLibraries, false);
  executeAction(idMk, desc4, DialogModes.NO);
}

So können wir später so etwas wie createNewSwatch('cool swatch', 255, 0, 0);ein neues rotes Farbfeld erstellen.

Das Lesen eines json hängt davon ab, wie der json aussieht. Wenn es sich um einen einfachen Json handelt:

var data = {
  colors: [
  {
    name: "calming grey",
    color: [92, 94, 104]
  },{
    name: "alarming grey",
    color: [54, 42, 42]
  },]
}

wir können diese Datei einfach auswerten:

$.evalFile('/E/temp/temp_js/myjson.json')
alert(data); // will alert [Object]

wenn es so gestringt ist:

{"colors":[{"name":"calming grey","color":[92,94,104]},{"name":"alarming grey","color":[54,42,42]}]}

Wir müssen eine JSON-Bibliothek einbinden, die Sie im Internet finden können, um die Datei zu lesen und zu analysieren. Aber wie lesen wir eine Datei? Wir googlen das und packen es in eine Funktion, etwa so:

function readFile(link) {
    var b = new File(link);
    b.open('r');
    var str = "";
    while(!b.eof)
    str += b.readln();
    b.close();
    return str
}

Jetzt haben wir alles, was wir brauchen, also machen wir einfach eine Schleife, um alle Farben des json durchzugehen:

// to include json library
//@include "json2.js"

function main()
{

  try
  {
    var data = readFile('/E/temp/temp_js/myjson-string.json');
  }
  catch (e)
  {
    alert(e);
    return false; // if file isn't found, terminate
  }

  var dataObject = JSON.parse(data); // parse string to an object

  //for each element of my dataObject.color array:
  for (var i = 0; i < dataObject.colors.length; i++)
  {
    // create a new swatch with element name and element color
    createNewSwatch(dataObject.colors[i].name,
      dataObject.colors[i].color[0],
      dataObject.colors[i].color[1],
      dataObject.colors[i].color[2])
  }

  /////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////
  /////////////////////////////////////////////////////////////////////////////////////

  // function to read a file
  function readFile(link)
  {
    var b = new File(link);
    if (!b.exists) throw 'File ' + link + ' not found';
    b.open('r');
    var str = "";
    while (!b.eof)
      str += b.readln();
    b.close();
    return str
  }

  //function to create a swatch
  function createNewSwatch(name, red, green, blue)
  {
    // =======================================================
    var idMk = charIDToTypeID("Mk  ");
    var desc4 = new ActionDescriptor();
    var idnull = charIDToTypeID("null");
    var ref1 = new ActionReference();
    var idClrs = charIDToTypeID("Clrs");
    ref1.putClass(idClrs);
    desc4.putReference(idnull, ref1);
    var idUsng = charIDToTypeID("Usng");
    var desc5 = new ActionDescriptor();
    var idNm = charIDToTypeID("Nm  ");
    desc5.putString(idNm, name);
    var idClr = charIDToTypeID("Clr ");
    var desc6 = new ActionDescriptor();
    var idRd = charIDToTypeID("Rd  ");
    desc6.putDouble(idRd, red);
    var idGrn = charIDToTypeID("Grn ");
    desc6.putDouble(idGrn, green);
    var idBl = charIDToTypeID("Bl  ");
    desc6.putDouble(idBl, blue);
    var idRGBC = charIDToTypeID("RGBC");
    desc5.putObject(idClr, idRGBC, desc6);
    var idClrs = charIDToTypeID("Clrs");
    desc4.putObject(idUsng, idClrs, desc5);
    var idpushToDesignLibraries = stringIDToTypeID("pushToDesignLibraries");
    desc4.putBoolean(idpushToDesignLibraries, false);
    executeAction(idMk, desc4, DialogModes.NO);
  }

}
main()