Scripten mit Photoshop (Teil 2)


Nachdem ich im ersten Tutorial ein paar Grundlagen des Scripting gezeigt habe und wir ein Script aufgezeichnet haben, wollen wir nun unser erstes richtiges Script schreiben. Es soll am Ende eine beliebige Anzahl an Kreisen zeichnen können. Ich gehe davon aus, dass keine VB-Kenntnisse vorhanden sind und werde deshalb die Schritte (am Anfang) ausführlich erläutern.

1.Allgemeiner Aufbau einer Scriptdatei

Der allgemeine Teil in einem PS-Script sieht immer gleich aus, daher habe ich ihn mir als ein Template mit folgendem Inhalt gespeichert:

Option Explicit

Dim appref, docref, startRulerUnits

Set appref = CreateObject("Photoshop.Application")
startRulerUnits = appref.Preferences.RulerUnits
appref.Preferences.RulerUnits = 5 'Pixel

If appref.Documents.Count <> 0 Then
   Set docref = appref.ActiveDocument
Else
   Set docref = appref.Documents.Add(500, 500, 72, "Unbenannt1.psd")
End If

appref.Preferences.RulerUnits = startRulerUnits

Erklärungen:

- Option Explicit

Dies ist ein VB-Befehl, der angibt, dass alle Variablen deklariert werden müssen. Ist nicht zwingend erforderlich.

- Dim appref, docref, startRulerUnits

Damit werden 3 Variablen deklariert (d. h. festgelegt bzw. erstellt). Die Bezeichnungen habe ich aus dem Scripting Guide übernommen, Sie können die Variablen natürlich benennen wie Sie wollen.

- Set appref = CreateObject("Photoshop.Application")

Einfach ausgedrückt: Wir weisen PS die Variable "appref" zu, so dass wir mit ihr auf PS zugreifen können.

- startRulerUnits = appref.Preferences.RulerUnits

Wir weisen der Variablen "startRulerUnits" die aktuellen Einheiten von PS zu.

- appref.Preferences.RulerUnits = 5 'Pixel

Wir stellen die Einheiten in PS in Pixel ein, da sich hiermit am leichtesten arbeiten lässt. Nach dem ' stehen nur Kommentare, das Wort "Pixel" ist also nur ein Kommentar.
Jetzt wird auch der vorige Schritt klar. Da wir die Einheiten umstellen, müssen wir uns vorher die aktuellen Einstellungen merken, um sie am Ende wieder herstellen zu können.

- If appref.Documents.Count <> 0 Then
Set docref = appref.ActiveDocument
Else
Set docref = appref.Documents.Add(500, 500, 72, "Unbenannt1.psd")
End If
Mit Set docref = appref.ActiveDocument weisen wir der Variable "docref" das aktuell geöffnete Dokument in PS zu. Die If-Else-EndIf-Anweisung könnten wir uns theoretisch sparen, aber dann würde es zu einer Fehlermeldung kommen, wenn kein Dokument geöffnet ist.
Also wird zuerst abgefragt, Ob die Anzahl der geöffneten Dokumenteungleich 0 ist (man hätte logscherweise auch >0 benutzen können). Ist das der Fall, wird der Befehl ausgeführt, falls nicht, wird der Befehl unter der Else Anweisung ausgeführt.
Dieser erstellt ein neues Dokument mit 500x500px, 72dpi Auflösung und dem Namen "Unbenannt1.psd".

So, das war auch schon das Template, wir stellen nur noch am Ende mit appref.Preferences.RulerUnits = startRulerUnits die urspünglichen Einheiten wieder her.


2.Eine kreisförmige Auswahl erstellen

Da mir keine Möglichkeit bekannt ist direkt mit Befehlen eine kreisförmige Auswahl zu erstellen, bedienen wir uns bei der vom SL aufgezeichneten Datei (siehe Teil 1). Wir erinnern uns, dass folgender Code eine kreisförmige Auswahl im aktuellen Dokument erzeugt:

DIM objApp
SET objApp = CreateObject("Photoshop.Application")
REM Use dialog mode 3 for show no dialogs
DIM dialogMode
dialogMode = 3
DIM id98
id98 = objApp.CharIDToTypeID( "Strk" )
DIM desc16
SET desc16 = CreateObject( "Photoshop.ActionDescriptor" )
DIM id99
.
.
.
( id112, 0.000000 )
DIM id113
id113 = objApp.CharIDToTypeID( "CMYC" )
Call desc16.PutObject( id108, id113, desc17 )
Call objApp.ExecuteAction( id98, desc16, dialogMode )

Da wir ja die Koordinaten schon durch Variablen ersetzt haben, müssen wir sie natürlich auch deklarieren und ihnen Werte zuweisen (folgt später).

Nun verschieben wir den aufgezeichneten Code in eine Prozedur, die wir über ihren Namen jederzeit wieder aufrufen können und übergeben ihr auch gleich noch die Werte für die Koordinaten. Schreiben wir also über dem aufgezeichneten Teil: Sub Auswahl (oben, unten, rechts, links) und darunter End Sub.
Aufrufen können wir das Ganze jetzt an jeder beliebigen Stelle im Programmcode (auch mehrfach) mit den gewünschten Koordinaten oben, unten, rechts und links auf.
Testen werden wir das gleich, vorher noch ein neuer Befehl: docref.Selection.Stroke appref.ForegroundColor, 2. Dieser bewirkt dasselbe wie der Befehl im Menü "Bearbeiten > Kontur füllen". Er füllt also die Kontur mit der eingestellten Vordergrundfarbe und 2px Kantenstärke. Das ist auch schon alles, was man braucht um Kreise/Ellipsen zu zeichnen. Der Code sollte bisher so aussehen:

Option Explicit

Dim appref, docref, startRulerUnits, oben, unten, links, rechts

Set appref = CreateObject("Photoshop.Application")
startRulerUnits = appref.Preferences.RulerUnits
appref.Preferences.RulerUnits = 5 'Pixel

If appref.Documents.Count <> 0 Then
   Set docref = appref.ActiveDocument
Else
   Set docref = appref.Documents.Add(500, 500, 72, "Ellipsen.psd")
End If

oben = 0
links= 0
unten= 500
rechts= 500

Auswahl oben, unten, rechts, links
docref.Selection.Stroke appref.ForegroundColor, 2

oben = 50
links= 50
unten= 450
rechts= 450

Auswahl oben, unten, rechts, links
docref.Selection.Stroke appref.ForegroundColor, 2

Auswahl 100, 400, 400, 100 'Wie man sieht, kann man auch direkt die Koordinaten übergeben
docref.Selection.Stroke appref.ForegroundColor, 2


appref.Preferences.RulerUnits = startRulerUnits

Sub Auswahl (oben, unten, rechts, links)
Dim dialogMode
dialogMode = 3
Dim objApp
Set objApp = CreateObject("Photoshop.Application")
Dim id21
id21 = objApp.CharIDToTypeID("setd")
Dim desc4
Set desc4 = CreateObject("Photoshop.ActionDescriptor")
Dim id22
id22 = objApp.CharIDToTypeID("null")
Dim ref1
Set ref1 = CreateObject("Photoshop.ActionReference")
Dim id23
id23 = objApp.CharIDToTypeID("Chnl")
Dim id24
id24 = objApp.CharIDToTypeID("fsel")
Call ref1.PutProperty(id23, id24)
Call desc4.PutReference(id22, ref1)
Dim id25
id25 = objApp.CharIDToTypeID("T ")
Dim desc5
Set desc5 = CreateObject("Photoshop.ActionDescriptor")
Dim id26
id26 = objApp.CharIDToTypeID("Top ")
Dim id27
id27 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id26, id27, oben)
Dim id28
id28 = objApp.CharIDToTypeID("Left")
Dim id29
id29 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id28, id29, links)
Dim id30
id30 = objApp.CharIDToTypeID("Btom")
Dim id31
id31 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id30, id31, unten)
Dim id32
id32 = objApp.CharIDToTypeID("Rght")
Dim id33
id33 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id32, id33, rechts)
Dim id34
id34 = objApp.CharIDToTypeID("Elps")
Call desc4.PutObject(id25, id34, desc5)
Dim id35
id35 = objApp.CharIDToTypeID("AntA")
Call desc4.PutBoolean(id35, True)
Call objApp.ExecuteAction(id21, desc4, dialogMode)
End Sub

Nun kommt erstmal wieder die Zeit zum Testen und Experimentieren, bevor wir das Ganze etwas vereinfachen.


3.Kreise zeichnen

Es wäre ganz schön übel, wenn man die Kreise alle so zeichnen sollte, da bräuchte man keine Scripte. Also vereinfachen wir den Code ein wenig, indem wir uns einer For-Next-Schleife bedienen. Die Syntax der Schleife sieht folgendermaßen aus:

For Zähler = Anfang To Ende [Step Schritt]
[Anweisungen]
[Exit For]
[Anweisungen]
Next

Wir wollen 3 Kreise im Abstand von 50px zeichnen, also schreiben wir in unser Script (nachdem wir alles ausser dem Template und der Prozedur Auswahl wieder gelöscht haben):

docref.ArtLayers.Add 'Erstellt einen neuen Layer im Dokument
oben = 0
links= 0
unten= 500
rechts= 500

For i=1 to 3
   Auswahl oben, unten, rechts, links
   docref.Selection.Stroke appref.ForegroundColor, 2
   oben=oben+50
   links=links+50
   unten=unten-50
   rechts=rechts-50
Next

Was hier gemacht wird dürfte klar sein, wenn man sich den Code anschaut.

Natürlich müssen wir die eingeführte Variable i vorher noch deklarieren mit Dim i (oder hinter die anderen Variablen schreiben). Das muss man bei jeder neuen Variable machen, ich werde es deshalb nicht immer extra dazuschreiben.

Jetzt sieht doch unser Code schon etwas besser aus. Wollen wir jetzt aber den Abstand und/oder die Konturstärke ändern, müssen wir jedes Mal die gewünschten Werte im Code suchen und ändern. Wir führen deshalb 2 neue Variablen ein: abst (für den Abstand) und kntr (für die Konturstärke). Ich weiß, die Namen sind nicht sonderlich gut gewählt, aber sie sind kurz (schreibfaul) und halbwegs aussagekräftig. Sie können die Variablen natürlich auch "Abstand" und "Kontur" nennen, je nach Belieben.
Unser Code sieht nun folgendermaßen aus:

docref.ArtLayers.Add 'Erstellt eine neue Ebene im Dokument
kntr=2
abst=50
oben = 0
links= 0
unten= 500
rechts= 500

For i=1 to 3
   Auswahl oben, unten, rechts, links
   docref.Selection.Stroke appref.ForegroundColor, kntr
   oben=oben+abst
   links=links+abst
   unten=unten-abst
   rechts=rechts-abst
Next

Jetzt findet man die Werte schneller und kann sie abändern. Genau das machen wir auch für die Anzahl der Kreise.
Wäre es aber nicht noch einfacher, wenn wir sie nicht im Script ändern müssen, sondern uns das Script nach den Werten fragt? Dafür gibt es in VB den Befehl "Inputbox", dessen Syntax folgendermaßen ist:
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context]).
Wir wollen gefragt werden, welchen Abstand wir für die Kreise haben wollen und welche Konturstärke. Unser Code sieht also folgendermassen aus:

abst = CInt(InputBox("Abstand der Ellipsen:", "Ellipsen", 50))
kntr = CInt(InputBox("Konturstärke:", "Ellipsen", 2))

Was die Argumente im Einzelnen für Auswirkungen haben, lässt sich durch ein wenig experimentieren einfach feststellen.

So, das war es auch schon mit diesem 2-teiligen Artikel. Ich denke als Grundlage ist das erstellte Script gut zu gebrauchen und es lässt sich auch einfach abändern oder ergänzen.
Ich hoffe hiermit einen kleinen Einblick in das Scripten mit PS gegeben zu haben.

Hier zum Vergleich noch mal das fertige Script:

Option Explicit

Dim appref, docref, startRulerUnits, oben, unten, links, rechts, i

Set appref = CreateObject("Photoshop.Application")
startRulerUnits = appref.Preferences.RulerUnits
appref.Preferences.RulerUnits = 5 'Pixel

If appref.Documents.Count <> 0 Then
 Set docref = appref.ActiveDocument
Else
 Set docref = appref.Documents.Add(500, 500, 72, "Ellipsen.psd")
End If

docref.ArtLayers.Add
oben = 0
links= 0
unten= 500
rechts= 500

For i=1 to 3
   Auswahl oben, unten, rechts, links
   docref.Selection.Stroke appref.ForegroundColor, 2
   oben=oben+50
   links=links+50
   unten=unten-50
   rechts=rechts-50
Next

appref.Preferences.RulerUnits = startRulerUnits

Sub Auswahl (oben, unten, rechts, links)
Dim dialogMode
dialogMode = 3
Dim objApp
Set objApp = CreateObject("Photoshop.Application")
Dim id21
id21 = objApp.CharIDToTypeID("setd")
Dim desc4
Set desc4 = CreateObject("Photoshop.ActionDescriptor")
Dim id22
id22 = objApp.CharIDToTypeID("null")
Dim ref1
Set ref1 = CreateObject("Photoshop.ActionReference")
Dim id23
id23 = objApp.CharIDToTypeID("Chnl")
Dim id24
id24 = objApp.CharIDToTypeID("fsel")
Call ref1.PutProperty(id23, id24)
Call desc4.PutReference(id22, ref1)
Dim id25
id25 = objApp.CharIDToTypeID("T ")
Dim desc5
Set desc5 = CreateObject("Photoshop.ActionDescriptor")
Dim id26
id26 = objApp.CharIDToTypeID("Top ")
Dim id27
id27 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id26, id27, oben)
Dim id28
id28 = objApp.CharIDToTypeID("Left")
Dim id29
id29 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id28, id29, links)
Dim id30
id30 = objApp.CharIDToTypeID("Btom")
Dim id31
id31 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id30, id31, unten)
Dim id32
id32 = objApp.CharIDToTypeID("Rght")
Dim id33
id33 = objApp.CharIDToTypeID("#Pxl")
Call desc5.PutUnitDouble(id32, id33, rechts)
Dim id34
id34 = objApp.CharIDToTypeID("Elps")
Call desc4.PutObject(id25, id34, desc5)
Dim id35
id35 = objApp.CharIDToTypeID("AntA")
Call desc4.PutBoolean(id35, True)
Call objApp.ExecuteAction(id21, desc4, dialogMode)
End Sub

Autor: hotschen

Weitere Funktionen
Zur Artikel-Übersicht
Diesen Artikel ausdrucken
Haben Sie noch Fragen? Fragen Sie auf computer-portal.net.
Bewertung
Dieser Tipp wurde für genial mit 10 von 10 Punkten [ 1 Stimme(n) ] befunden.

Bewertung in Punkten [10 = genial, 1 = sehr schlecht]:      
Kommentare
Bisherige Kommentare ansehen:
Zu diesem Artikel wurden noch keine Kommentare verfasst.

Einen eigenen Kommentar verfassen:
Sie müssen sich erst registrieren um einen Kommentar verfassen zu können.

Bestellen
Abbestellen
    
    
    Weitere Informationen
  Welchen Browser nutzen Sie?
Internet Explorer
Mozilla
Mozilla Firefox
Netscape
Opera
Safari
Sonstige
    Ergebnis ansehen