Skip to main content
New Participant
December 10, 2022
Answered

How to make a stroke layer style using a script?

  • December 10, 2022
  • 3 replies
  • 1345 views

Is there a way to create a stroke layer style that automatically uses the foreground color and a gradient stroke using the foreground and background colors?

This topic has been closed for replies.
Correct answer Stephen Marsh

This one creates a gradient stroke style using a gradient preset of "Foreground to Background". The gradient-related values are at defaults.

 

// Uses a gradient preset named "Foreground to Background"

// Get the foreground RGB values
var fR = foregroundColor.rgb.red;
var fG = foregroundColor.rgb.green;
var fB = foregroundColor.rgb.blue;

// Get the background RGB values
var bR = backgroundColor.rgb.red;
var bG = backgroundColor.rgb.green;
var bB = backgroundColor.rgb.blue;

setGradStrokeStyle(100, true, true, true, 100, 3, 128, 128, 128, "Foreground to Background", 4096, fR, fG, fB, 0, 50, bR, bG, bB, 4096, 50, 100, 0, 50, 100, 4096, 50, 90, false, false, 100, true, 0, 0, false);

function setGradStrokeStyle(scale, enabled, present, showInDialog, opacity, size, red, grain, blue, name2, interfaceIconFrameDimmed, red2, grain2, blue2, location, midpoint, red3, grain3, blue3, location2, midpoint2, opacity2, location3, midpoint3, opacity3, location4, midpoint4, angle, reverse, dither, scale2, align, horizontal, vertical, overprint) {
	var s2t = function (s) {
		return app.stringIDToTypeID(s);
	};

	var descriptor = new ActionDescriptor();
	var descriptor2 = new ActionDescriptor();
	var descriptor3 = new ActionDescriptor();
	var descriptor4 = new ActionDescriptor();
	var descriptor5 = new ActionDescriptor();
	var descriptor6 = new ActionDescriptor();
	var descriptor7 = new ActionDescriptor();
	var descriptor8 = new ActionDescriptor();
	var descriptor9 = new ActionDescriptor();
	var descriptor10 = new ActionDescriptor();
	var descriptor11 = new ActionDescriptor();
	var descriptor12 = new ActionDescriptor();
	var list = new ActionList();
	var list2 = new ActionList();
	var reference = new ActionReference();

	reference.putProperty( s2t( "property" ), s2t( "layerEffects" ));
	reference.putEnumerated( s2t( "layer" ), s2t( "ordinal" ), s2t( "targetEnum" ));
	descriptor.putReference( s2t( "null" ), reference );
	descriptor2.putUnitDouble( s2t( "scale" ), s2t( "percentUnit" ), scale );
	descriptor3.putBoolean( s2t( "enabled" ), enabled );
	descriptor3.putBoolean( s2t( "present" ), present );
	descriptor3.putBoolean( s2t( "showInDialog" ), showInDialog );
	descriptor3.putEnumerated( s2t( "style" ), s2t( "frameStyle" ), s2t( "insetFrame" ));
	descriptor3.putEnumerated( s2t( "paintType" ), s2t( "frameFill" ), s2t( "gradientFill" ));
	descriptor3.putEnumerated( s2t( "mode" ), s2t( "blendMode" ), s2t( "normal" ));
	descriptor3.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity );
	descriptor3.putUnitDouble( s2t( "size" ), s2t( "pixelsUnit" ), size );
	descriptor4.putDouble( s2t( "red" ), red );
	descriptor4.putDouble( s2t( "grain" ), grain );
	descriptor4.putDouble( s2t( "blue" ), blue );
	descriptor3.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor4 );
	descriptor5.putString( s2t( "name" ), name2 );
	descriptor5.putEnumerated( s2t( "gradientForm" ), s2t( "gradientForm" ), s2t( "customStops" ));
	descriptor5.putDouble( s2t( "interfaceIconFrameDimmed" ), interfaceIconFrameDimmed );
	descriptor7.putDouble( s2t( "red" ), red2 );
	descriptor7.putDouble( s2t( "grain" ), grain2 );
	descriptor7.putDouble( s2t( "blue" ), blue2 );
	descriptor6.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor7 );
	descriptor6.putEnumerated( s2t( "type" ), s2t( "colorStopType" ), s2t( "userStop" ));
	descriptor6.putInteger( s2t( "location" ), location );
	descriptor6.putInteger( s2t( "midpoint" ), midpoint );
	list.putObject( s2t( "colorStop" ), descriptor6 );
	descriptor9.putDouble( s2t( "red" ), red3 );
	descriptor9.putDouble( s2t( "grain" ), grain3 );
	descriptor9.putDouble( s2t( "blue" ), blue3 );
	descriptor8.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor9 );
	descriptor8.putEnumerated( s2t( "type" ), s2t( "colorStopType" ), s2t( "userStop" ));
	descriptor8.putInteger( s2t( "location" ), location2 );
	descriptor8.putInteger( s2t( "midpoint" ), midpoint2 );
	list.putObject( s2t( "colorStop" ), descriptor8 );
	descriptor5.putList( s2t( "colors" ), list );
	descriptor10.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity2 );
	descriptor10.putInteger( s2t( "location" ), location3 );
	descriptor10.putInteger( s2t( "midpoint" ), midpoint3 );
	list2.putObject( s2t( "transferSpec" ), descriptor10 );
	descriptor11.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity3 );
	descriptor11.putInteger( s2t( "location" ), location4 );
	descriptor11.putInteger( s2t( "midpoint" ), midpoint4 );
	list2.putObject( s2t( "transferSpec" ), descriptor11 );
	descriptor5.putList( s2t( "transparency" ), list2 );
	descriptor3.putObject( s2t( "gradient" ), s2t( "gradientClassEvent" ), descriptor5 );
	descriptor3.putUnitDouble( s2t( "angle" ), s2t( "angleUnit" ), angle );
	descriptor3.putEnumerated( s2t( "type" ), s2t( "gradientType" ), s2t( "linear" ));
	descriptor3.putBoolean( s2t( "reverse" ), reverse );
	descriptor3.putBoolean( s2t( "dither" ), dither );
	descriptor3.putUnitDouble( s2t( "scale" ), s2t( "percentUnit" ), scale2 );
	descriptor3.putBoolean( s2t( "align" ), align );
	descriptor12.putUnitDouble( s2t( "horizontal" ), s2t( "percentUnit" ), horizontal );
	descriptor12.putUnitDouble( s2t( "vertical" ), s2t( "percentUnit" ), vertical );
	descriptor3.putObject( s2t( "offset" ), s2t( "paint" ), descriptor12 );
	descriptor3.putBoolean( s2t( "overprint" ), overprint );
	descriptor2.putObject( s2t( "frameFX" ), s2t( "frameFX" ), descriptor3 );
	descriptor.putObject( s2t( "to" ), s2t( "layerEffects" ), descriptor2 );
	executeAction( s2t( "set" ), descriptor, DialogModes.NO );
}

 

3 replies

Stephen Marsh
Stephen MarshCorrect answer
Braniac
December 10, 2022

This one creates a gradient stroke style using a gradient preset of "Foreground to Background". The gradient-related values are at defaults.

 

// Uses a gradient preset named "Foreground to Background"

// Get the foreground RGB values
var fR = foregroundColor.rgb.red;
var fG = foregroundColor.rgb.green;
var fB = foregroundColor.rgb.blue;

// Get the background RGB values
var bR = backgroundColor.rgb.red;
var bG = backgroundColor.rgb.green;
var bB = backgroundColor.rgb.blue;

setGradStrokeStyle(100, true, true, true, 100, 3, 128, 128, 128, "Foreground to Background", 4096, fR, fG, fB, 0, 50, bR, bG, bB, 4096, 50, 100, 0, 50, 100, 4096, 50, 90, false, false, 100, true, 0, 0, false);

function setGradStrokeStyle(scale, enabled, present, showInDialog, opacity, size, red, grain, blue, name2, interfaceIconFrameDimmed, red2, grain2, blue2, location, midpoint, red3, grain3, blue3, location2, midpoint2, opacity2, location3, midpoint3, opacity3, location4, midpoint4, angle, reverse, dither, scale2, align, horizontal, vertical, overprint) {
	var s2t = function (s) {
		return app.stringIDToTypeID(s);
	};

	var descriptor = new ActionDescriptor();
	var descriptor2 = new ActionDescriptor();
	var descriptor3 = new ActionDescriptor();
	var descriptor4 = new ActionDescriptor();
	var descriptor5 = new ActionDescriptor();
	var descriptor6 = new ActionDescriptor();
	var descriptor7 = new ActionDescriptor();
	var descriptor8 = new ActionDescriptor();
	var descriptor9 = new ActionDescriptor();
	var descriptor10 = new ActionDescriptor();
	var descriptor11 = new ActionDescriptor();
	var descriptor12 = new ActionDescriptor();
	var list = new ActionList();
	var list2 = new ActionList();
	var reference = new ActionReference();

	reference.putProperty( s2t( "property" ), s2t( "layerEffects" ));
	reference.putEnumerated( s2t( "layer" ), s2t( "ordinal" ), s2t( "targetEnum" ));
	descriptor.putReference( s2t( "null" ), reference );
	descriptor2.putUnitDouble( s2t( "scale" ), s2t( "percentUnit" ), scale );
	descriptor3.putBoolean( s2t( "enabled" ), enabled );
	descriptor3.putBoolean( s2t( "present" ), present );
	descriptor3.putBoolean( s2t( "showInDialog" ), showInDialog );
	descriptor3.putEnumerated( s2t( "style" ), s2t( "frameStyle" ), s2t( "insetFrame" ));
	descriptor3.putEnumerated( s2t( "paintType" ), s2t( "frameFill" ), s2t( "gradientFill" ));
	descriptor3.putEnumerated( s2t( "mode" ), s2t( "blendMode" ), s2t( "normal" ));
	descriptor3.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity );
	descriptor3.putUnitDouble( s2t( "size" ), s2t( "pixelsUnit" ), size );
	descriptor4.putDouble( s2t( "red" ), red );
	descriptor4.putDouble( s2t( "grain" ), grain );
	descriptor4.putDouble( s2t( "blue" ), blue );
	descriptor3.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor4 );
	descriptor5.putString( s2t( "name" ), name2 );
	descriptor5.putEnumerated( s2t( "gradientForm" ), s2t( "gradientForm" ), s2t( "customStops" ));
	descriptor5.putDouble( s2t( "interfaceIconFrameDimmed" ), interfaceIconFrameDimmed );
	descriptor7.putDouble( s2t( "red" ), red2 );
	descriptor7.putDouble( s2t( "grain" ), grain2 );
	descriptor7.putDouble( s2t( "blue" ), blue2 );
	descriptor6.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor7 );
	descriptor6.putEnumerated( s2t( "type" ), s2t( "colorStopType" ), s2t( "userStop" ));
	descriptor6.putInteger( s2t( "location" ), location );
	descriptor6.putInteger( s2t( "midpoint" ), midpoint );
	list.putObject( s2t( "colorStop" ), descriptor6 );
	descriptor9.putDouble( s2t( "red" ), red3 );
	descriptor9.putDouble( s2t( "grain" ), grain3 );
	descriptor9.putDouble( s2t( "blue" ), blue3 );
	descriptor8.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor9 );
	descriptor8.putEnumerated( s2t( "type" ), s2t( "colorStopType" ), s2t( "userStop" ));
	descriptor8.putInteger( s2t( "location" ), location2 );
	descriptor8.putInteger( s2t( "midpoint" ), midpoint2 );
	list.putObject( s2t( "colorStop" ), descriptor8 );
	descriptor5.putList( s2t( "colors" ), list );
	descriptor10.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity2 );
	descriptor10.putInteger( s2t( "location" ), location3 );
	descriptor10.putInteger( s2t( "midpoint" ), midpoint3 );
	list2.putObject( s2t( "transferSpec" ), descriptor10 );
	descriptor11.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity3 );
	descriptor11.putInteger( s2t( "location" ), location4 );
	descriptor11.putInteger( s2t( "midpoint" ), midpoint4 );
	list2.putObject( s2t( "transferSpec" ), descriptor11 );
	descriptor5.putList( s2t( "transparency" ), list2 );
	descriptor3.putObject( s2t( "gradient" ), s2t( "gradientClassEvent" ), descriptor5 );
	descriptor3.putUnitDouble( s2t( "angle" ), s2t( "angleUnit" ), angle );
	descriptor3.putEnumerated( s2t( "type" ), s2t( "gradientType" ), s2t( "linear" ));
	descriptor3.putBoolean( s2t( "reverse" ), reverse );
	descriptor3.putBoolean( s2t( "dither" ), dither );
	descriptor3.putUnitDouble( s2t( "scale" ), s2t( "percentUnit" ), scale2 );
	descriptor3.putBoolean( s2t( "align" ), align );
	descriptor12.putUnitDouble( s2t( "horizontal" ), s2t( "percentUnit" ), horizontal );
	descriptor12.putUnitDouble( s2t( "vertical" ), s2t( "percentUnit" ), vertical );
	descriptor3.putObject( s2t( "offset" ), s2t( "paint" ), descriptor12 );
	descriptor3.putBoolean( s2t( "overprint" ), overprint );
	descriptor2.putObject( s2t( "frameFX" ), s2t( "frameFX" ), descriptor3 );
	descriptor.putObject( s2t( "to" ), s2t( "layerEffects" ), descriptor2 );
	executeAction( s2t( "set" ), descriptor, DialogModes.NO );
}

 

New Participant
December 10, 2022

Thank you, this script runs perfectly.

Stephen Marsh
Braniac
December 10, 2022

You're welcome.

Stephen Marsh
Braniac
December 10, 2022

The following script will set a new stroke style using the foreground colour:

 

// Get the foreground RGB values
var fR = foregroundColor.rgb.red;
var fG = foregroundColor.rgb.green;
var fB = foregroundColor.rgb.blue;

// Set the stroke style
setStrokeStyle(100, true, true, true, "insetFrame", "normal", 100, 3, fR, fG, fB, false);

function setStrokeStyle(scale, enabled, present, showInDialog, position, blend, opacity, size, red, grain, blue, overprint) {
	var s2t = function (s) {
		return app.stringIDToTypeID(s);
	};
	var descriptor = new ActionDescriptor();
	var descriptor2 = new ActionDescriptor();
	var descriptor3 = new ActionDescriptor();
	var descriptor4 = new ActionDescriptor();
	var reference = new ActionReference();
	reference.putProperty( s2t( "property" ), s2t( "layerEffects" ));
	reference.putEnumerated( s2t( "layer" ), s2t( "ordinal" ), s2t( "targetEnum" ));
	descriptor.putReference( s2t( "null" ), reference );
	descriptor2.putUnitDouble( s2t( "scale" ), s2t( "percentUnit" ), scale );
	descriptor3.putBoolean( s2t( "enabled" ), enabled );
	descriptor3.putBoolean( s2t( "present" ), present );
	descriptor3.putBoolean( s2t( "showInDialog" ), showInDialog );
	descriptor3.putEnumerated( s2t( "style" ), s2t( "frameStyle" ), s2t( position )); // "insetFrame" | "outsetFrame" | "centeredFrame"
	descriptor3.putEnumerated( s2t( "paintType" ), s2t( "frameFill" ), s2t( "solidColor" ));
	descriptor3.putEnumerated( s2t( "mode" ), s2t( "blendMode" ), s2t( blend ));
	descriptor3.putUnitDouble( s2t( "opacity" ), s2t( "percentUnit" ), opacity );
	descriptor3.putUnitDouble( s2t( "size" ), s2t( "pixelsUnit" ), size );
	descriptor4.putDouble( s2t( "red" ), red );
	descriptor4.putDouble( s2t( "grain" ), grain );
	descriptor4.putDouble( s2t( "blue" ), blue );
	descriptor3.putObject( s2t( "color" ), s2t( "RGBColor" ), descriptor4 );
	descriptor3.putBoolean( s2t( "overprint" ), overprint );
	descriptor2.putObject( s2t( "frameFX" ), s2t( "frameFX" ), descriptor3 );
	descriptor.putObject( s2t( "to" ), s2t( "layerEffects" ), descriptor2 );
	executeAction( s2t( "set" ), descriptor, DialogModes.NO );
}

 

Bojan Živković11378569
Braniac
December 10, 2022

You can not achieve this using Photoshop actions, it will record colors used. Maybe using script. @jazz-y @r-bin @c.pfaffenbichler @Stephen Marsh