Poza granicami akcji, czyli pisanie skryptów do Photoshopa

Automatyzacja pracy w Photoshopie może przyprawić o ból głowy lub odgłos zachwytu. Mało którzy użytkownicy tego programu naprawdę używają operacji (dziwne słowo na angielskie „actions“, dla mnie to po prostu akcje). Bo przecież żeby naprawdę potrzebować akcji/operacji, ktoś musi mieć do obrobienia tysiące zdjęć — po to właśnie akcje zostały stworzone — by zapisywać sekwencje czynności powtarzanych stale na każdym dokumencie.

Ale zostanie nam tylko jakaś część tych użytkowników, jeśli zapytamy się o znajomość ograniczeń akcji — a jest ich całkiem dużo. Chociażby przenoszenie warstw z jednego dokumentu do drugiego z zachowaniem położenia. Czy też wpisywanie określonego tekstu w określonej pozycji. Tego akcje nie potrafią zrobić.

Odpowiedzią na te problemy i potrzeby jest coś, co leży daleko za akcjami, nawet najbardziej skomplikowanymi. To samodzielne pisanie skryptów obsługujących Photoshopa „od kuchni“. Ta funkcjonalność Photoshopa zarezerwowana jest dla prawdziwych fanatyków i nieuleczalnych geek’ów. Ja właśnie takim geekiem jestem, a że miałem też za dużo wolnego czasu, zacząłem pisać skrypty do Photoshopa.

Skrypty pisze się w języku JavaScript, więc wszyscy web developersi powinni już się witać z gąską. Skrypty te można pisać gdziekolwiek — w notatniku, jakimś edytorze kodu źródłowego — ale najlepiej robić to w programie dołączanym do programów Adobe, który niezgrabnie nazywa się ExtendScript Toolkit. Prawdopodobnie masz go gdzieś w menu Start. Zaletą tego programu jest rozbudowana dokumentacja i baza obiektów, metod, oraz atrybutów jakie Adobe „wbudowało“ w Photoshopa i inne programy. Dzięki nim możemy rzeczywiście coś robić w tych programach — tworzyć dokumenty, warstwy itp — wywołując odpowiednie funkcje w skrypcie.

Skrypt, z którym tutaj się zapoznasz, napisałem wieki (5 lat) temu, na moje własne potrzeby, kiedy potrzebowałem obrobić setki zdjęć dodając do nich przezroczystą belkę, logo i numer porządkowy. Zanim jednak przejdziemy do kodu źródłowego, chcę polecić najlepsze źródło informacji i dokumentacji o pisaniu skryptów do programów Adobe. Jest to e-book JavaScript Tools Guide.pdf, który znajduje się w folderze <ścieżka do programów>\Adobe\Adobe Utilities\ExtendScript Toolkit\SDK. Po analizie tego podręcznika średnio rozgarnięty użytkownik JavaScriptu będzie w stanie pisać nawet dość rozbudowane skrypty. A teraz kod:

[sourcecode language=„javascript“]/*
Automatyczna obróbka fotografii. Skrypt wstawia belkę,
numer porządkowy i logo z zewnętrznego pliku, wstawia
też dane EXIF do plików.

Copyright© 2007, 2011 Sebastian Kończak <Psboy​.pl>
*/

// sprawdza czy jednostki ustawione są na piksele
if (app.preferences.rulerUnits != Units.PIXELS) {
app.preferences.rulerUnits = Units.PIXELS;
}

// licznik zdjęć
var liczba = 1;

// główna pętla, będzie działać dopóki są pliki
// do obrobienia
while(app.documents.length != 0) {
// skrótowa zmienna do aktywnego dokumentu
var img = app.activeDocument;
// zmienia rozmiar pliku na 640×480 pikseli
if(img.width > img.height) {
img.resizeImage(640, 480, 72);
} else {
img.resizeImage(480, 640, 72);
}
// tworzymy nową warstwę z 50% opacity
var warstwa = img.artLayers.add();
warstwa​.name = „belka“;
img.activeLayer.opacity = 50;
// tworzymy belkę na nowo utworzonej warstwie,
// najpierw zaznaczamy prostokąt do wypełnienia.
if (img.width > img.height) {
var zakres = [
[0,430],
[640,430],
[640,480],
[0,480]
];
img.selection.select(zakres);
} else {
var zakres = [
[0,590],
[480,590],
[480,640],
[0,640]
];
img.selection.select (zakres);
}

// wypełniamy belkę kolorem białym
var kolor = new SolidColor();
kolor.rgb.red = 255;
kolor.rgb.green = 255;
kolor.rgb.blue = 255;
img.selection.fill(kolor);

// usunięcie selekcji
img.selection.deselect();

// wstawiamy tekst
var tekst = img.artLayers.add();
tekst​.name = „t“;
tekst.kind = LayerKind.TEXT;

// ustawiamy numer porządkowy
var nr_porz = img.artLayers[„t“].textItem;
nr_porz.contents = liczba;
nr_porz.font = „Tahoma“;
nr_porz.size = 48;
if (img.width > img.height) {
nr_porz.position = [15,475];
} else {
nr_porz.position = [15,630];
}

// wstawienie logo
var logo = „<tu wstaw swoją ścieżkę do pliku>“;
// app.open(logo);
// app.activeDocument.selection.selectAll;

// S C R I P T L I S T E N E R (wstawia plik z logo i pozycjonuje go)
// script listener jest wymagany dla niektórych operacji których nie da
// się zakodować ręcznie.

var id3 = charIDToTypeID( „Plc “ );
var desc2 = new ActionDescriptor();
var id4 = charIDToTypeID( „null“ );
desc2.putPath( id4, new File(logo) );
var id5 = charIDToTypeID( „FTcs“ );
var id6 = charIDToTypeID( „QCSt“ );
var id7 = charIDToTypeID( „Qcsa“ );
desc2.putEnumerated( id5, id6, id7 );
var id8 = charIDToTypeID( „Ofst“ );
var desc3 = new ActionDescriptor();
var id9 = charIDToTypeID( „Hrzn“ );
var id10 = charIDToTypeID( „#Pxl“ );

if(img.width > img.height) {
desc3.putUnitDouble( id9, id10,235.000000 );
} else {
desc3.putUnitDouble( id9, id10,160.000000 );
}

var id11 = charIDToTypeID( „Vrtc“ );
var id12 = charIDToTypeID( „#Pxl“ );
if (img.width > img.height) {
desc3.putUnitDouble( id11, id12, 217.000000 );
} else {
desc3.putUnitDouble( id11, id12, 310.000000 );
}

var id13 = charIDToTypeID( „Ofst“ );
desc2.putObject( id8, id13, desc3 );
executeAction( id3, desc2, DialogModes​.NO );

// K O N I E C S C R I P T L I S T E N E R A

// spłaszczamy warstwy
img.mergeVisibleLayers();

// tworzymy wpis do exif
img.info.author = „Sebastian Kończak“;
img.info.copyrightNotice = „© 2007, 2011 Psboy​.pl“;

// zapisanie pliku
var sciezka = new File(„c:\plik_“ + liczba + „.jpg“);
var opcje = new JPEGSaveOptions();
opcje.embedColorProfile = true;
opcje.formatOptions = FormatOptions.STANDARDBASELINE;
opcje.matte = MatteType.NONE;
opcje.quality = 8;
img.saveAs(sciezka, opcje, true, Extension.LOWERCASE);

// zamykamy bierzący plik i zwiększamy licznik o 1
img.close(SaveOptions.DONOTSAVECHANGES);
liczba++;
}[/sourcecode]

Ten skrypt wykonuje następujące czynności:

  • ustawienie pętli która będzie się powtarzać do czasu zamknięcia ostatniego dokumentu.
  • zmiana rozmiaru dokumentu na 600 x 480 px.
  • utworzenie nowej warstwy o 50% przezroczystości.
  • utworzenie zaznaczenia i wypełnienie białym kolorem, tworząc belkę
  • wypisanie numeru porządkowego
  • wstawienie logo z zewnętrznego pliku
  • zapis gotowego jpega z informacją exif
  • zamknięcie dokumentu
  • zamknięcie skryptu jeśli nie ma już dokumentów

I to tyle. Spróbuj samemu napisać skrypt, gwarantuję że satysfakcja jest ogromna, kiedy obserwuje się jak Photoshop wykonuje wszystkie polecenia zapisane w naszym skrypcie.

Aby uruchomić nasz skrypt w Photoshopie, wejdź w menu File — Scripts — Browse i wybierz z dysku skrypt. To wszystko! W naszej ofercie jest już kompleksowy kurs Photoshopa do automatyzacji i pisania skryptów. Zobacz darmowe lekcje :)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>