Bitte beachte das Urheberrecht!
Please respect copyright!
S´il vous plaît respecter le droit d´auteur!
Si prega di rispettare il copyright!
Respeta la propiedad intelectual!
Respeite os direitos autorais!
Kunnioita tekijänoikeuksia!
Моля, спазвайте авторските права
Παρακαλείστε να σέβονται τα πνευματικά δικαιώματα
请尊重版权
logo

slice composing – howto

Photoshop Extended Script

Im vorigen Artikel zum Theme habe ich das Prinzip des slice compositioning kurz vorgestellt. Nun möchte ich zeigen, wie das mit Photoshop funktioniert. Und zwar mit dem so genannten Extended Scripting von Adobe. Darunter versteht man die Möglichkeit, Adobe Softwareprodukte (wie Photoshop, Premiere, Illustrator o.a.) durch eigene Programmierungen zu erweitern.

Ein Skript kann so einfach wie eine gewöhnliche automatisierte Aufgabe, oder aber so komplex wie eine ganz neue Funktion sein. Vielleicht denkt ihr jetzt: Photoshop hat ja schon Aktionen, wozu also ein Skript? Wie of ist die Antwort ein eindeutiges: Ja. aber. Mit Aktionen kann man sehr einfach und intuitiv immer gleich ablaufende Sequenzen von Bearbeitungsschritten festlegen. Das ist super, wenn ich eine Reihe von Bildern immer gleich bearbeiten will. Ein Skript hingegen kann wesentlich komplexere und vor allem dynamisch angepasste Aufgaben erledigen. Ein Skript ist eigentlich ein wirkliches Programm, nur dass es nicht unmittelbar in einen maschinenlesbaren Code umgesetzt wird, sondern die geschriebenen Programmanweisungen von einem so genannten Interpreter abgearbeitet werden.

Ihr habt schon einmal von JavaScript gehört, das auf vielen Webseiten zum Einsatz kommt? Genau diese Programmiersprache verwende ich auch für die Sktipts bei Photoshop. Adboe stellt dafür auch einige umfangreiche Dokumentationen und Tools zur freien Verfügung.

Ich möchte hier keine Anleitung zum Programmieren geben, deshalb zeige ich nur ein kleines Code-Schnipsel aus dem Slice Composer in JavaScript, um zu sehen, wie so etwas ausschaut.

var doc = open(settings.fileArray[i]);

// Convert picture to RGB and 8bpc
doc.changeMode(ChangeMode.RGB);
doc.bitsPerChannel = BitsPerChannelType.EIGHT;

// Copy picture layer into new document
var layer = doc.activeLayer;
layer.duplicate(newDoc, ElementPlacement.PLACEATBEGINNING);

doc.close(SaveOptions.DONOTSAVECHANGES); // Close latest imported picture

// Generate a selection and delete unused pixels - keeping current slice pixels
var sliceCutoutBegin;

if( settings.sliceStartingPixel == 1)
sliceCutoutBegin = i * settings.slicePixels;
else
sliceCutoutBegin = settings.sliceStartingPixel - 1;

var slicePos = [ [sliceCutoutBegin, 0],
[sliceCutoutBegin + settings.slicePixels, 0],
[sliceCutoutBegin + settings.slicePixels, settings.outputPictureHeight],
[sliceCutoutBegin, settings.outputPictureHeight] ];

newDoc.selection.select(slicePos); // Select this slice

if( winMain.panelSlices.grpRepeat.chkRepeat.value == true )
{
// Multiple selections
var nextColumn = settings.repeatAfterPixels * settings.slicePixels;

while( nextColumn < settings.height )
{
slicePos = [ [sliceCutoutBegin + nextColumn, 0],
[sliceCutoutBegin + nextColumn + settings.slicePixels, 0],
[sliceCutoutBegin + nextColumn + settings.slicePixels, settings.outputPictureHeight],
[sliceCutoutBegin + nextColumn, settings.outputPictureHeight] ];

// Add new slice to the selection
newDoc.selection.select(slicePos, SelectionType.EXTEND);

nextColumn += (settings.repeatAfterPixels * settings.slicePixels);
}
}

newDoc.selection.invert(); // Select all pixels but not this slice
newDoc.selection.clear(); // Delete them on active layer (copied picture)
newDoc.selection.deselect(); // Restore

Diese Sequenz stammt aus der Funktion, welche einzelne Pixelzeilen aus Eingangsbildern extrahiert, mit einer Maske freistellt, die nicht benötigten Bildinhalte löscht und das Resultat dann an die richtige Position für das Ausgangsbild verschiebt. So eine Aufgabe wäre mit Aktionen nicht durchführbar. Soviel zu den technischen Hintergründen des Skripts.

Interessanter ist aber wahrscheinlich die Frage: Kann ich das auch machen?

Die Antwort ist einfach: Ja. Ich stelle das gesamte Script zum Download zur Verfügung. Mit nur einer Einschränking dieser Demoversion, dass nämlich Bilder bis zu einer Kantenlänge von 1.000 Pixel erzeugt werden können. Das Script könnt ihr hier als so gennantes Extended JavaScript Binary in einem gepackten zip-Archiv runterladen:

grossberger.photo Slice Composer Demo.zip

Die nächste Frage ist natürlich, wie man das in Photoshop laden und ausführen kann. Zuerst müsst ihr bitte die jsxbin-Datei und die dazu gehörende xml-Datei (zur Konfiguration der Arbeit mit dem Script) aus dem zip-Archiv entpacken, dafür gibt es jede Menge Tools für alle Betriebssysteme. Übrigens funktionieren Skripte grundsätzlich unter Betriebssystemen von sowohl Apple wie auch Microsoft. Nun gibt es zwei Möglichkeiten.

Script manuell laden

Speichert das Script also irgendwo auf eurem PC ab. Dann startet Photoshop, und wählt im Menü den Befehl Datei > Skripten > Durchsuchen aus. Im folgenden Dialog sucht ihr nach dem Script, dort wo es vorher gespeichert wurde. Ein Klick auf Laden und Photoshop startet das Script.

oder

Skript automatisch laden

Wenn ihr das Script öfter verwenden wollt, was mich natürlich freut, dann geht folgendemaßen vor.

Speichert das Script NICHT irgendwo auf eurem PC ab, sondern dort wo Photoshop beim Start nach solchen Scripts sucht. Bei Photoshop CC wäre das (unter Windows) der Standardordner C:\Programme\Adobe\Adobe Photoshop CC 2019\Presets\Scripts.

Dann startet Photoshop, und wählt im Menü den Befehl Datei > Skripten. Dort findet ihr dein Eintrag grossberger.photo Slice Composer. Ein Klick darauc und Photoshop startet das Script.

Das war gar nicht so schwierig, oder? Wenn alles funktioniert hat, dann seht ihr jetzt den Dialog des Scripts wo ihr alle Parameter einstellen könnt. Dazu im Detail dann mehr im nächsten Beitrag.

Leave a reply

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.