Skip to main content
Participant
May 7, 2017
Answered

JavaScripting HSB

  • May 7, 2017
  • 2 replies
  • 1155 views

Still new to all this.

I'm making script, and as a step I need to shift hue by set amount in recently opened document.

Like this:

Before, just opened

After hue shift +80

I tried to google it, but everything listed doesn't work for me. Currently I just use bit recorded with ScriptListener:

    var idHStr = charIDToTypeID("HStr");

    var desc5 = new ActionDescriptor();

    var idpresetKind = stringIDToTypeID("presetKind");

    var idpresetKindType = stringIDToTypeID("presetKindType");

    var idpresetKindCustom = stringIDToTypeID("presetKindCustom");

    desc5.putEnumerated(idpresetKind, idpresetKindType, idpresetKindCustom);

    var idClrz = charIDToTypeID("Clrz");

    desc5.putBoolean(idClrz, false);

    var idAdjs = charIDToTypeID("Adjs");

    var list1 = new ActionList();

    var desc6 = new ActionDescriptor();

    var idH = charIDToTypeID("H   ");

    desc6.putInteger(idH, 80);

    var idStrt = charIDToTypeID("Strt");

    desc6.putInteger(idStrt, 0);

    var idLght = charIDToTypeID("Lght");

    desc6.putInteger(idLght, 0);

    var idHsttwo = charIDToTypeID("Hst2");

    list1.putObject(idHsttwo, desc6);

    desc5.putList(idAdjs, list1);

    executeAction(idHStr, desc5, DialogModes.NO);

But that's too crude and hard to manage.

I know, that I must set SolidColor, like this:

var NewHue = new SolidColor();

NewHue.hsb.hue = 80;

But I cannot apply it. Well, app says I applied it, but no difference seen.

This topic has been closed for replies.
Correct answer pixxxelschubser

Well, little to none, see above.


Without to write two lines in one it seems to be that 8 lines are the minimum required code

(desc1 = new ActionDescriptor()).putEnumerated(stringIDToTypeID('presetKind'), stringIDToTypeID('presetKindType'), stringIDToTypeID('presetKindCustom'))

desc1.putBoolean(stringIDToTypeID('colorize'), false);

(desc2 = new ActionDescriptor()).putInteger(stringIDToTypeID('hue'), 80)

desc2.putInteger(stringIDToTypeID('saturation'), 0)

desc2.putInteger(stringIDToTypeID('lightness'), 0);

(list1 = new ActionList()).putObject(stringIDToTypeID('hueSatAdjustmentV2'), desc2);

desc1.putList(stringIDToTypeID('adjustment'), list1)

executeAction(stringIDToTypeID('hueSaturation'), desc1, DialogModes.NO);

2 replies

SuperMerlin
Inspiring
May 7, 2017

Try this...

hueLayer(80,0,0);

function hueLayer(hue,sat,bright) {

var desc86 = new ActionDescriptor();

var ref51 = new ActionReference();

ref51.putClass( charIDToTypeID('AdjL') );

desc86.putReference( charIDToTypeID('null'), ref51 );

var desc87 = new ActionDescriptor();

var desc88 = new ActionDescriptor();

desc88.putEnumerated( stringIDToTypeID('presetKind'), stringIDToTypeID('presetKindType'), stringIDToTypeID('presetKindDefault') );

desc88.putBoolean( charIDToTypeID('Clrz'), false );

desc87.putObject( charIDToTypeID('Type'), charIDToTypeID('HStr'), desc88 );

desc86.putObject( charIDToTypeID('Usng'), charIDToTypeID('AdjL'), desc87 );

try{

executeAction( charIDToTypeID('Mk  '), desc86, DialogModes.NO );

}catch(e){}

var desc89 = new ActionDescriptor();

var ref52 = new ActionReference();

ref52.putEnumerated( charIDToTypeID('Chnl'), charIDToTypeID('Chnl'), charIDToTypeID('RGB ') );

desc89.putReference( charIDToTypeID('null'), ref52 );

desc89.putBoolean( charIDToTypeID('MkVs'), false );

try{

executeAction( charIDToTypeID('slct'), desc89, DialogModes.NO );

}catch(e){}

var desc90 = new ActionDescriptor();

var ref53 = new ActionReference();

ref53.putEnumerated( charIDToTypeID('AdjL'), charIDToTypeID('Ordn'), charIDToTypeID('Trgt') );

desc90.putReference( charIDToTypeID('null'), ref53 );

var desc91 = new ActionDescriptor();

desc91.putEnumerated( stringIDToTypeID('presetKind'), stringIDToTypeID('presetKindType'), stringIDToTypeID('presetKindCustom') );

var list9 = new ActionList();

var desc92 = new ActionDescriptor();

desc92.putInteger( charIDToTypeID('H   '), hue );

desc92.putInteger( charIDToTypeID('Strt'), sat );

desc92.putInteger( charIDToTypeID('Lght'), bright );

list9.putObject( charIDToTypeID('Hst2'), desc92 );

desc91.putList( charIDToTypeID('Adjs'), list9 );

desc90.putObject( charIDToTypeID('T   '), charIDToTypeID('HStr'), desc91 );

try{

executeAction( charIDToTypeID('setd'), desc90, DialogModes.NO );

}catch(e){}

};

pixxxelschubser
Community Expert
Community Expert
May 7, 2017

Your ScriptListener code works as it is (on every selected artlayer). This means the layer should be selected (and not a layer with a selection). And you don't need a new SolidColor.

Save you code as jsx and run from script menu in PS.

Here is the same code as yours, but only a little bit cleaned

var desc1 = new ActionDescriptor();

desc1.putEnumerated( stringIDToTypeID('presetKind'), stringIDToTypeID('presetKindType'), stringIDToTypeID('presetKindCustom') );

desc1.putBoolean( charIDToTypeID('Clrz'), false );

    var list1 = new ActionList();

        var desc2 = new ActionDescriptor();

        desc2.putInteger( charIDToTypeID('H   '), 80 );

        desc2.putInteger( charIDToTypeID('Strt'), 0 );

        desc2.putInteger( charIDToTypeID('Lght'), 0 );

    list1.putObject( charIDToTypeID('Hst2'), desc2 );

desc1.putList( charIDToTypeID('Adjs'), list1 );

executeAction( charIDToTypeID('HStr'), desc1, DialogModes.NO );

Have fun

Participant
May 7, 2017

I know that it works, script containing it worked just fine.

Now I have to include it in more elaborate algorhitm than before, and this block is very hard to properly maintain.

I hoped that there exists something shorter and more transparent, about 5-6 lines total.

pixxxelschubser
Community Expert
Community Expert
May 7, 2017

How good is your Javascript knowledgebase?

You can work with functions. Rewrite the above code as function

function hueCorrection(hue, sat, bright) {

    var desc1 = new ActionDescriptor();

    desc1.putEnumerated( stringIDToTypeID('presetKind'), stringIDToTypeID('presetKindType'), stringIDToTypeID('presetKindCustom') );

    desc1.putBoolean( charIDToTypeID('Clrz'), false );

        var list1 = new ActionList();

            var desc2 = new ActionDescriptor();

            desc2.putInteger( charIDToTypeID('H   '), hue );

            desc2.putInteger( charIDToTypeID('Strt'), sat );

            desc2.putInteger( charIDToTypeID('Lght'), bright );

        list1.putObject( charIDToTypeID('Hst2'), desc2 );

    desc1.putList( charIDToTypeID('Adjs'), list1 );

    executeAction( charIDToTypeID('HStr'), desc1, DialogModes.NO );

};

Call this function with this line whenever you need it:

hueCorrection(80,0,0);

Have fun