Cíl lekce
Pro výsledný vodoznak, který je vidět na obrázku, postupuji v několika krocích. Prvním krokem je načtení souborů, které chci modifikovat do listu, přes zadanou cestu a následné načtění vodoznaku do proměnné. Poté je třeba projít každý soubor v listu, otevřít jej a získat výšku, šířku. Vodoznak je třeba taktéž otevřít, vytvořit výběr, zkopírovat a zavřít soubor. Poté vložit vodoznak do nové vrstvy a nastavit jí průhlednost. V poslední řadě je třeba vytvořit funkci pro ukládání obrázků a v cyklu ji volat.
Výsledný vodoznak - obrázek 7.1
Využité třídy v této lekci
- Application: kořenová třída, která obsahující třídy File a Folder.
- Document: třída, která mi umožní přístup k atributům souboru (výška, šířka).
- Selection: třída pro výběr a manipulaci.
- Layers: třída vrstev
Načtení cest a souborů do listu
Do proměnné sampleFolder načtu adresář, kde se nachází soubory k modifikaci.
Pomocí metody getFiles(), která vrací list souborů, uložím do proměnné fileList soubory k
modifikaci.
Proměnná watermarkFile obsahuje soubor s vodoznakem.
Třídy Folder a File berou jako parametr cestu k souboru / adresáři. Aby byl skript interaktivní vzhledem k uživateli, přidal jsem
také možnost zadat cestu k souboru s vodoznakem pomocí průzkumníka souborů. Využiji potvrzovací dialog a zeptám se uživatele, zdali si přeje zadat cesktu k
vodoznaku pomocí průzkumníka. Funkce confrim(), požaduje tři parametry: text, boolean (true pokud má být první označeno ano, false pokud ne) a titulek okna.
Samotná funkce poté vrací boolean s ohledem na co uživatel klikl. V případě, že tedy uživatel klikl na ano, pomocí funkce openDialog() otevřu
průzkumníka souborů výsledek vložím do objektu třídy File a uložím do proměnné. Takto úspěšně uložím interaktivně cestu k danému souboru. Pokud
bych chtěl to samé udělat pro adresář, kde se nacházejí soubory pro zpracování, musel bych uložit cestu alespoň k jednomu ze souborů a název tohoto souboru poté oříznou,
abych dostal vytoužený odresář. Dalo by se tedy toho docílit prací s řetězcem v jazyke JavaScript. Jako udávání cest, bych nedoporučil dávat relativní cestu, jelikož
jsem zjistil, že Adobe Photoshop bere v potaz jako výchozí adresář, adresář scripts, který se nachází v cestě uložení programu. Toto by v případě různých nastaveních práv na systému, či
využívání několika uživatelů v systému mohlo vést k potížím z důvodu práv zápisu do tohoto adresáře.
//uložení složky se soubory do proměnné sampleFolder
var sampleFolder = Folder('C:/Users/dbala/Desktop/test');
//list souborů
var fileList = sampleFolder.getFiles()
var watermarkFile = new File('C:/Users/David/Downloads/test/instagram.png');
//tento řádek kódu je možné zakomentovat, není nutný
var nahratVodoznak = confirm("Přejete si zadat cestu k uloženému vodoznaku" +
" pomocí průzkumníka nebo jste již cestu zadal ve skriptu?", false, "Vodoznak");
if (nahratVodoznak) {
//proměnná obsahující vodoznak
watermarkFile = new File(app.openDialog());
}
Hlavní cyklus a získání atributů souboru
Pro procházení seznamu souborů použiji cyklus (foreach). Kde proměnná i představuje
aktuální prvek v listu.
Poté ošetřím chybu pro případ, že prvek není stejného datového typu, který požaduji.
Nakonec otevřu soubor a uložím si jeho atributy – šířku, výšku a název pro pozdější práci.
for(var i in fileList){
//je objekt třídy File?
if(fileList[i] instanceof File){
//otevři
try{
open(fileList[i]);
}catch(err){
alert(err)
continue;
}
//získej atributy souboru
var width = app.activeDocument.width
var height = app.activeDocument.height
var nameOfImage = fileList[i].name
//... dalsi postup
}
Výběr a vložení vodoznaku
Pomocí podmínky ošetřím případ, že soubor není validní.
Poté si připravím do proměnné backFile aktivní dokument a změním si velikost podle potřeby.
Metodou selectAll() vyberu vše, zkopíruji výběr do schránky a soubor zavřu bez provádění změn
viz. lekce č.2.
Do aktivního dokumentu vložím výběr, dokument automaticky vytvoří novou vrstvu ke které pomocí atributu
.name přistoupím a nastavím na libovolný název.
Opět přistoupím k aktivní vrtsvě pomocí atributu activeLayer a nastavím průhlednost na
požadovanou hodnotu, v tomto případě 10.
if(watermarkFile){
//připravení aktivní vrstvy
var backFile= app.activeDocument
//změna vodoznaku
backFile.resizeImage(width,height);
backFile.selection.selectAll();
//zkopírování výběru do schránky
backFile.selection.copy();
//zavření souboru bez uložení změn
backFile.close(SaveOptions.DONOTSAVECHANGES);
//vložení výberu a modifikace vrstvy
app.activeDocument.paste();
app.activeDocument.activeLayer.name = "BackgroundImage";
app.activeDocument.activeLayer.opacity = 10
Vytvoření funkce pro uložení obrázku se zpětnou kompabilitou
V následující části si vytvořím objekt, do kterého uložím všechny parametry pro uložení obrázku ve formátu .psd se zpětnou kompabilitou mezi verzemi
programu Adobe Photoshop. Objektu ActionDescriptor nastavím atribut pro maximalizaci kompability na true a poté tento objekt vložím
do popisu uložení, kde konstanta Pht3 značí uložení v nativním formátu Adobe Photoshop. Následně do metody putPath() zadám cestu, kam
se má soubor uložit a dále jen provedu akci save s parametrem DialogModes.NO a tímto eliminuji, vyskakující dialog zobrazující se při ukládání.
function ulozObrazek(nazev) {
var popis = new ActionDescriptor();
var popisUlozeni = new ActionDescriptor();
popisUlozeni.putBoolean(stringIDToTypeID('maximizeCompatibility'), true);
popis.putObject(charIDToTypeID('As '), charIDToTypeID('Pht3'), popisUlozeni);
popis.putPath(charIDToTypeID('In '),
new File('C:/Users/dbala/Desktop/vysledek/' + nazev + '_upraveny.psd'));
executeAction(charIDToTypeID('save'), popis, DialogModes.NO);
}
Výsledný zdrojový kód - hlavní cyklus
var sampleFolder = Folder('C:/Users/dbala/Desktop/test');
var fileList = sampleFolder.getFiles()
var watermarkFile = new File('C:/Users/David/Downloads/test/instagram.png');
//proměnná s vodoznakem
var nahratVodoznak = confirm("Přejete si zadat cestu k uloženému vodoznaku" +
" pomocí průzkumníka nebo jste již cestu zadal ve skriptu?", false, "Vodoznak");
if (nahratVodoznak) {
watermarkFile = new File(app.openDialog());
}
//cyklus pro procházení adresáře se soubory
for (var i in fileList) {
//kontrola pokud se jedná o soubor v adresáři
if (fileList[i] instanceof File) {
try {
//otevření souboru
open(fileList[i]);
} catch (err) {
//chybová hláška v případě selhání
alert(err)
continue;
}
//získání výšky a šířky aktivního dokumentu
var width = app.activeDocument.width
var height = app.activeDocument.height
var nameOfImage = fileList[i].name
//načtení vodoznaku
app.load(watermarkFile);
if (watermarkFile) {
var backFile = app.activeDocument;
var sirkaVyberu = backFile.width
var vyskaVyberu = backFile.height
//změna velikosti vodoznaku pro vytvářený dokument
//pokud nechci měnit velikost vodoznaku stačí zakomentovat
//backFile.resizeImage(width, height);
//výběr
backFile.selection.selectAll();
//zkopírování výběru
backFile.selection.copy();
backFile.close(SaveOptions.DONOTSAVECHANGES);
//vložení vodoznaku
app.activeDocument.paste();
//moznost umisteni vodoznaku do praveho dolniho rohu, pokud
//je vodoznak mensi nez obrazek
/*
var osaX = width - sirkaVyberu;
var osaY = height - vyskaVyberu;
if(osaX > 0 && osaY > 0){
app.activeDocument.activeLayer.translate(osaX/2, osaY/2)
}
*/
app.activeDocument.activeLayer.name = "BackgroundImage";
//nastavení průhlednosti
app.activeDocument.activeLayer.opacity = 10
}
ulozObrazek(nameOfImage);
}
}
alert("Dokončeno!")
function ulozObrazek(nazev) {
var popis = new ActionDescriptor();
var popisUlozeni = new ActionDescriptor();
//nastavení pro maximální kompabilitu
popisUlozeni.putBoolean(stringIDToTypeID('maximizeCompatibility'), true);
popis.putObject(charIDToTypeID('As '), charIDToTypeID('Pht3'), popisUlozeni);
popis.putPath(charIDToTypeID('In '),
new File('C:/Users/dbala/Desktop/vysledek/' + nazev + '_upraveny.psd'));
//provedení uložení
executeAction(charIDToTypeID('save'), popis, DialogModes.NO);
}