Vytvoření portrétu, krajiny s okraji

lekce 10.

Automatizování úloh v Adobe Photoshop

Pomocí skriptovacího jazyka JavaScript

Cíl lekce

Cílem je transformovat otevřený obrázek v programu Adobe Photoshop na potrét, či krajinu vzhledem k velikosti plátna. Zároveň vytvoření okrajů k grafice, které se rovnají jedné desetině rozměru výšky, šířky. Grafické úpravy jsou vidět níže pod tímto odstavcem v obou verzích – krajina, portrét.

images/lekce_8PuvodniLandScape.png

Původní obrázek - obrázek 10.1

images/lekce_8VyslednyLandScape.png

Výsledný obrázek (krajina) - obrázek 10.2

images/lekce_8PuvodniPortret.png

Původní obrázek- obrázek 10.3

images/lekce_8VyslednyPortret.png

Výsledný obrázek (portrét) - obrázek 10.4


Využité třídy v této lekci

  • Application: pro práci s atributy dokumentu.
  • Selection: vytváření výběrů.
  • SolidColor: definování barvy.
  • Preferences: nastavení jednotek.

Vytvoření barvy

Pro tvorbu barvy zvolím vytvoření jednoduché funkce, která vrací třídu SolidColor s již předdefinovanou barvou. Barvu lze libovolně modifikovat podle uvážení, samozřejmně v rozmezí od 0 do 255 odstínu barvy. Funkce tedy vytvoří objekt třídy SolidColor a definuje její barvové složky pomocí modelu RGB.


function getColor(){
		//objekt
        var color = new SolidColor();
		//zastoupení barvových složek
        backgroundC.rgb.red = 0;
        backgroundC.rgb.green = 0;
        backgroundC.rgb.blue = 0;
        return color;
}
				

Funkce pro výběr

Následně potřebuji vytvořit výběr z grafiky. Rozlišením zdali je šířka menší jak výška zjistím, zda-li se jedná o portrét či krajinu. Podle toho výsledku vyberu oblast. V případě krajiny vždy na ose X posouvám výběr o rozdíl šířka, výšky dělený dvěma a osa Y je pro mě buď nula či maximální výška. Toto je u portrétu naopak s přidáním přičtení šířky u osy Y. Výsledné pole výběru si vratím jako návratovou hodnotu pomocí klíčového slova (return).


function createArray(width, height){
    var selection;
    if(width < height){
            //potrét
            selection = Array(
            Array(0,(height-width)/2), //horní levý roh
            Array(0, (height-width)/2+width),
            Array(width, (height-width)/2+width), //pravý dolní roh
            Array(width, (height-width)/2));
    }else{
            //krajina
            selection = Array(
            Array((width-height)/2,0), //horní levý roh
            Array((width-height)/2+height,0), /
            Array((width-height)/2+height,height), //dolní pravý roh
            Array((width-height)/2,height));
    }
     return selection;
}
				

Dialog potvrzení změn

Ještě před provedením změn, otevřu pro uživatele dialog pro potvrzení změn, které se mají provést. funkce confirm() požadu je tři parametry, text, aktivní tlačítko dialogu(false = ano, true = ne), titulek. Do textu si vložím všechny vypočítané souřadnice a pomoci \n je jednoduše naformátuji. Samotná funkce poté vrací booleanovskou proměnou, zda uživatel klikl na ano, či ne.

//dialog pro potvrzení změn
function createConfirmDialog(selection, widthHeight){
    return confirm("Výsledný soubor bude o velikosti: " + widthHeight + "x" + widthHeight +
        " s výběrem: \n" + "Levý horní roh: " +
    selection[0] + "\n" + "Pravý horní roh: " +
    selection[1] + "\n" + "Levý dolní roh: " +
    selection[2] + "\n" + "Pravý dolní roh: " +
    selection[3] + "\n", false, "Potvrzení změn");
}
				

Tělo skriptu

Nyní již zbývá použít připravené funkce a složit skript. Jako první se zeptám, jestli již obrázek není ve formátu čtverce, v tom případě bych jen přidal okraje. Pokud není provedu výběr metodou select(), poté provedu oříznutí a změnu velikosti obrázku na 1200 pixelových bodů. Uložím nové hodnoty výšky a šířky. Přes atribut backgroundColor nastavím barvu pozadí ze zavolané funkce a rozšířím obrázek o okraje, tedy změním velikost o hodnoty * 1.1. Všechny změny samozřejmě provedu pouze pokud je uživatel potvrdil a přidám několik informačních dialogů, aby byl skript více interaktivní.

if(app.documents.length){
    //jednotky pixelové body
    app.preferences.rulerUnits = Units.PIXELS;
    const finalVyska = 1200;
    const finalSirka  = 1200;

    //výška, šířka
    var w = app.activeDocument.width;
    var h = app.activeDocument.height;
    if (w != h){
        //výběr
        var selection = createArray(w, h);

        //výsledek dialogu pro potvrzení změn
        var makeChanges = createConfirmDialog(selection, 1200 * 1.1);

        if(makeChanges){
            app.activeDocument.selection.select(selection);
            //oříznutí
            app.activeDocument.crop(app.activeDocument.selection.bounds);
            //změna velikosti bicubickou metodou
            app.activeDocument.resizeImage(UnitValue(finalSirka,"px"),UnitValue(finalVyska,"px"),150,
                    ResampleMethod.BICUBIC,100);
            w = app.activeDocument.width;
            h = app.activeDocument.height;
        }
    }

    if(makeChanges){
        //nastavení barvy
        var color = getColor();
        backgroundColor = color;
        // změna velikosti
        app.activeDocument.resizeCanvas (w*1.1,h*1.1, AnchorPosition.MIDDLECENTER);

        alert("Změny provedeny!");
    }else{
        alert("Skript ukončen!");
    }
}else{
	alert("Žádný dokument není otevřený.", "Varování");
}

Výsledný zdrojový kód

if (app.documents.length) {
    //jednotky pixelové body
    app.preferences.rulerUnits = Units.PIXELS;
    const finalVyska = 1200;
    const finalSirka  = 1200;

    //výška, šířka
    var w = app.activeDocument.width;
    var h = app.activeDocument.height;
    if (w != h) {
        //výběr
        var selection = createArray(w, h);

        //výsledek dialogu pro potvrzení změn
        var makeChanges = createConfirmDialog(selection, 1200 * 1.1);

        if (makeChanges) {
            app.activeDocument.selection.select(selection);
            //oříznutí
            app.activeDocument.crop(app.activeDocument.selection.bounds);
            //změna velikosti bicubickou metodou
            app.activeDocument.resizeImage(UnitValue(finalSirka, "px"), UnitValue(finalVyska, "px"), 150,
                ResampleMethod.BICUBIC, 100);
            w = app.activeDocument.width;
            h = app.activeDocument.height;
        }
    }

    if (makeChanges) {
        //nastavení barvy
        var color = getColor();
        backgroundColor = color;
        // změna velikosti
        app.activeDocument.resizeCanvas(w * 1.1, h * 1.1, AnchorPosition.MIDDLECENTER);

        alert("Změny provedeny!");
    } else {
        alert("Skript ukončen!");
    }
} else {
    alert("Žádný dokument není otevřený.", "Varování");
}

//dialog pro potvrzení změn
function createConfirmDialog(selection, widthHeight) {
    return confirm("Výsledný soubor bude o velikosti: " + widthHeight + "x" + widthHeight +
                " s výběrem: \n" + "Levý horní roh: " +
        selection[0] + "\n" + "Pravý horní roh: " +
        selection[1] + "\n" + "Levý dolní roh: " +
        selection[2] + "\n" + "Pravý dolní roh: " +
        selection[3] + "\n", false, "Potvrzení změn");
}

function createArray(width, height) {
    var selection;
    if (width < height) {
        // portrét
        selection = Array(
            Array(0, (height - width) / 2), //horní levý roh
            Array(0, (height - width) / 2 + width),
            Array(width, (height - width) / 2 + width), //dolní pravý roh
            Array(width, (height - width) / 2));
    } else {
        //krajina
        selection = Array(
            Array((width - height) / 2, 0), //horní levý roh
            Array((width - height) / 2 + height, 0),
            Array((width - height) / 2 + height, height), //dolní pravý roh
            Array((width - height) / 2, height));
    }
    return selection;
}

function getColor() {
    //objekt
    var color = new SolidColor();
    //definová barva modelu RGB
    color.rgb.red = 0;
    color.rgb.green = 0;
    color.rgb.blue = 0;
    return color;
}