Hromadné doplnění vodoznaků s uložením

lekce 7.

Automatizování úloh v Adobe Photoshop

Pomocí skriptovacího jazyka JavaScript

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.

watermark

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);
}