Photoshop scripting

Ik gebruik Photoshop zo ongeveer dagelijks sinds versie 2. Van in de prehistorie dus: nog vóór er lagen waren en dergelijke. Toen channel operations—chops—het nec plus ultra waren en Kai Krause alleen nog maar tips op de wereld losgelaten had.

Gegeven het volgende: een origineel beeld van onbekende grootte, en daar moet dan een rand rond, en een titel, een auteur, een datum, een URL en een logo op gepleurd worden. In Photoshop, welteverstaan.

Hopladiejee: ‘t is niet proper gedaan, maar het werkt wel—een scriptje dat titel, auteur, url (default http://www.gentblogt.be/) en datum (default vandaag) vraagt, en dat allemaal op de juiste plaats zet. En dat een logo inlaadt en dat ook op de juiste plaats zet. Resultaat:

200705_landuyt01

Ondanks al die jaren ervaring met Photoshop was dit mijn aller-allereerste script. En wat hebben we vandaag geleerd? Wel, dat het allemaal dat niet is, dat scripting in Photoshop.

Akkoord, er is een degelijke Photoshop scripting community, maar er zijn toch wel een aantal vervelende dingen ook. Het scriptje dat het ding hierboven doet, was op géén tijd geschreven: ‘t is dan ook gewoon standaard-javascript.

Behalve twee dingen. Nummer één: hoe onderlijn ik tekst? Zó maakt men een tekst aan:

var articleUrlLayer=doc.artLayers.add(); articleUrlLayer.kind=LayerKind.TEXT;
urlText=articleUrlLayer.textItem;
urlText.color=blue;
urlText.size=15.0;
urlText.font="MyriadPro-Cond";
urlText.justification=Justification.RIGHT;
urlText.position=new Array(doc.width-15, doc.height-15);
urlText.contents=plaatspublicatie;

En dan is er nog een property .underline, waarvan in de documentatie dit staat:

Constant type Values What it means
UnderlineType UNDERLINELEFT
UNDERLINEOFF
UNDERLINERIGHT

The placement of text underlining.

Note: UnderlineType.UNDERLINELEFT and UnderlineType.UNDERLINERIGHT are valid only when direction = Direction.VERTICAL

Grr. Die underlines gelden alleen als de tekst vertikaal staan? En gewone underline op horizontale tekst dan?

urlText.underline=UnderlineType.UNDERLINEON;? Nee. urlText.underline=UnderlineType.UNDERLINE;? Nee. urlText.underline=true;? Nee.

Nee hoor: urlText.underline=UnderlineType.UNDERLINELEFT;

Ah. OK. Fijn. Daar heb ik dus een uur naar lopen zoeken hé.

En nummer twee: als ik een ingeladen logo wil naar linksonderaan verschuiven, dan lijkt dat niet te lukken. In principe, alweer volgens de documentatie:

Method Parameter type What it means
translate
([deltaX]
 [, deltaY])
UnitValue
UnitValue

Moves the layer the specified amount (in pixels) relative to the current position.

Goed, da’s dus al een beetje contradictorisch: UnitValue, dat kan zowel inch of centimeter of pica of point zijn, en als dan in “What it means” geschreven wordt dat het om pixels gaat… tja.

En uiteindelijk, uiteindelijk, na veel proeren en doen, als het allemaal altijd verkeerd lijkt te gaan, blijkt dat translate() godverdomme wél in pixels werkt, maar zelfs als ik proper zeg dat app.preferences.rulerUnits=Units.PIXELS;, dat het dan pixel in 72 dpi  is. Lelijke oplossing: activeDocument.resizeImage(null,null,72,ResampleMethod.NONE); doen ergens in het begin van het script.

Propere oplossing, die ook zal werken als Adobe de bug verbetert: een factor definiëren in het begin

var factor=docRef.resolution/72;

en dan overal de offset delen door die factor:

doc.activeLayer.translate(breedte/factor, hoogte/factor);

Grmbl. Twee keer raden welke van de twee oplossingen ik gekozen heb. 🙂

3 reacties op “Photoshop scripting”

  1. Scripting in PS deed vroeger veel werk. Bij een hele batch pics resizen/croppen/renamen/… kan je de hele voormiddag “keihard” aan’t werk zijn…voor je PC met de krant. En Photoshop maar zwoegen en scriptjes runnen…

  2. Hi Michel, Thanks a lot – you saved me time – I just started with js to do my PS dirty work – and got stuck with “translate” – the layer would just not MOVE. – D

Reacties zijn gesloten.