Skriptujeme InDesign (22): Obrázky potřetí - Grafika.cz - vše o počítačové grafice

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Polygrafie

Skriptujeme InDesign (22): Obrázky potřetí

Adobe InDesign sazba

16. srpna 2006, 00.00 | I v této části našeho seriálu se budeme věnovat práci s obrázky. Podíváme se jednak na
různé postupy diagnostiky daného typu obsahu, jdoucí za běžné možnosti uživatelského
rozhraní, a dále si ukážeme některé návody, jak obrázky či způsoby jejích zobrazení
upravovat podle potřeb.

I v této části našeho seriálu se budeme věnovat práci s obrázky. Podíváme se jednak na různé postupy diagnostiky daného typu obsahu, jdoucí za běžné možnosti uživatelského rozhraní, a dále si ukážeme některé návody, jak obrázky či způsoby jejích zobrazení upravovat podle potřeb.

K vizuální diagnostice

Již posledně jsme si ukázali sérii postupů, jak efektivně řešit různé problémy především s odkazy na grafiku. K danému tématu se tímto vrátíme nejprve skriptem, který nabízí trochu jiný přístup k dané problematice. Konkrétně jde o to, že skript vytvoří duplikáty všech rámečků obsahujících grafiku v daném dokumentu, tyto umístí do zvláštní vrstvy a vyplní různými údaji o obrázcích podle požadavků. Skript může vypadat například takto:

var myDoc=app.activeDocument;
var myGr=myDoc.allGraphics;


//Vrstvu Popisky nejprve odstraníme (obrázky se mohly změnit)
try{myDoc.layers.item("Popisky").remove()}catch(e){}

//Nyní tutéž vrstvu znovu vytvoříme
try{myDoc.layers.add({name: "Popisky"})}catch(e){};

//V cyklu projdeme všechnu grafiku v dokumentu
for(i=0;i<myGr.length;i++){
    //Zpracováváme jednotlivé obrázky v dokumentu
    myIm=myGr[i];

    //Vytvoříme duplikát daného obrázkového rámečku a odstraníme z něj obrázek
    myFrame=myIm.parent.duplicate();
    myFrame.allGraphics[0].remove();

    //Duplikát umístíme do vrtvy Popisky
    myFrame.itemLayer="Popisky"

    //Trik s ID dovolí zachovat referenci na rámeček ipo změně jeho typu
    myID = myFrame.id;
    myParent = myFrame.parent;
    myFrame.contentType = ContentType.textType;
    myFrame = myParent.textFrames.itemByID(myID);

    //Nyní si můžeme rámeček upravit podle potřeb.
    //Nejprve upravíme barvu a šířku jeho tahu
    myFrame.strokeColor=app.activeDocument.swatches.item("C=15 M=100 Y=100 K=0");
    myFrame.strokeWeight="1pt";

    //Dále určíme parametry textu (velikost, zarovnání, font, případně barvu)
    myFrame.texts[0].properties={pointSize: "10pt", justification: Justification.centerAlign, appliedFont: "Times New Roman",
    fillColor: app.activeDocument.swatches.item("C=15 M=100 Y=100 K=0")
    };

    //Text bude v obdélníkových rámečcích zarovnán vertikálně na střed
    myFrame.textFramePreferences.verticalJustification=VerticalJustification.centerAlign;

    //Zde vložíme do rámečku požadované údaje k výpisu
    //Tady vypisujeme plné souborové jméno obrázku, velikost souboru a typ dané grafiky
    if(myIm.itemLink){
    myFrame.contents=myIm.itemLink.filePath.toString()+"\n"+myIm.itemLink.size.toString()+"\n"+myIm.itemLink.linkType.toString();
    }
    else{
    myFrame.contents="Vnořená grafika"
    }
}

sob3-1f.jpg

Obrázky před aplikací skriptu

sob3-2f.jpg

Obrázky po aplikací skriptu

sob3-3f.jpg

Zobrazena pouze vrstva Popisky

Sám o sobě má daný skript spíše jen didaktickou hodnotu (zajímavá je především změna typu rámečku, za příslušný trik vděčíme D. Saundersovi). Přesto ale jeho základní princip může posloužit při mnoha různých diagnostikách, kdy uživatel například v dokumentu vypne zobrazení všech vrstev mimo vrstvy "Popisky" a pak kontroluje či zjišťuje, jaký obrazový obsah je kde umístěn. Vyhrát si lze s pomocí různých podmínek v rámci skriptu například s odlišným barevným nastavením rámečků obrázků, u kterých je třeba chybný odkaz, objem obrázku je nad určitou mez atp. Do popisek je možno umístit třeba různá metadata souborů, informace o aktuálním a efektivním rozlišení (viz další výklad) atd. atd. Také je možné umisťovat do vrstvy rámečky pouze obrázků určitých typů, v příkladech vhodného použití by se dalo určitě dále pokračovat.

Mimochodem, skript díky tomu, že rámečky duplikuje, zachovává jejich tvar. To je na jednu stranu výhoda, na stranu druhou může být text vepsaný například do trojúhelníkového rámečku poněkud nepřehledný. Pokud tedy chceme popisek umístit vždy do obdélníkového rámečku, jehož rozměry odpovídají geometrickým hranicím (geometric bounds) objektu, stačí v daném skriptu začátek cyklu přepsat následovně:

//V cyklu projdeme všechnu grafiku v dokumentu
for(i=0;i<myGr.length;i++){
    //Zpracováváme jednotlivé obrázky v dokumentu
    myIm=myGr[i];

    //Zapamatujeme si geometric bounds daného obrázku
    myGB=myIm.geometricBounds;
    //Na stejnou stránku jako je obrázek (to je ten parent.parent) přidáme textový rámeček
    myFrame=myIm.parent.parent.textFrames.add();
    //Geometric bounds rámečku budou stejné jako u obrázku
    myFrame.geometricBounds=myGB;
    //Rámeček umístíme do vrtvy Popisky
    myFrame.itemLayer="Popisky"

    //Nyní si můžeme rámeček upravit podle potřeb.
    //Nejprve upravíme barvu a šířku jeho tahu
    myFrame.strokeColor=app.activeDocument.swatches.item("C=15 M=100 Y=100 K=0");
    myFrame.strokeWeight="1pt";
//atd. atd. - viz předchozí skript

Aktuální a efektivní ppi

Při diagnostice přijdou vhod i parametry bitmapové grafiky (objekt typu Image) actualPpi a effectivePpi. Zatímco první parametr vrací původní rozlišení obrázku (v podobě uspořádané dvojice hodnot, udávající rozlišení v horizontálním a vertikálním směru), druhý vrací rozlišení po zmenšení či zvětšení provedeném s obrázkem v daném rámečku. Jedná se o dosti důležité hodnoty, dovolující identifikovat například grafiku zdeformovanou, mající rozlišení vyšší či nižší než je požadované atp. Základní metody využití naznačuje následující skript:

//Skript, který vytvoří pole s obrázky nesplňujícími určité parametry rozlišení
var myDoc=app.activeDocument;
var myGr=myDoc.allGraphics;

//Určená hodnota pro rozlišení - lze změnit podle potřeb
var myPpi=144;

//Pole s obrázky majícími effectivePpi odlišné od actualPpi
var myDiff=new Array;

//Pole s obrázky majícími různé hodnoty pro horizontální a vertikální effectivePpi
var myDef=new Array;

//Pole s obrázky majícími effectivePpi větší než je určené
var myHigh=new Array;

//Projdeme všechny grafické objekty v dokumentu
for(i=0;i<myGr.length;i++){
    var myIm=myGr[i];

    //Zpracováváme pouze bitmapovou grafiku, která není vložená
    //Ke vkládání do jednotlivých polí používáme metodu push
    if((myIm.constructor.name=="Image")&&(myIm.itemLink)){
        if((myIm.effectivePpi[0]!=myIm.actualPpi[0])||(myIm.effectivePpi[1]!=myIm.actualPpi[1])){myDiff.push(myIm)}
        if(myIm.effectivePpi[0]!=myIm.effectivePpi[1]){myDef.push(myIm)}
        if((myIm.effectivePpi[0]>myPpi)||(myIm.effectivePpi[1]>myPpi)){myHigh.push(myIm)}
    }
}

S obsahem polí vytvořených v našem skriptu lze naložit různě, viz například pro pole myDiff:

//Zobrazí postupně všechny obrázky z daného pole, uvede u nich hodnoty jejich effectivePpi
if(myDiff){
    for(i=0;i<myDiff.length;i++){myDiff[i].itemLink.show();alert(myDiff[i].effectivePpi)}
    }

Otevření a zpracování obrázku v jiném programu

V případech, jako je výše naznačený, se vyplatí otevřít obrázek v jeho zpracovávající aplikaci (ve výše uvedeném příkladu třeba k tomu, abychom příliš velký obrázek zmenšili na správnou velikost). Chceme-li takovéto otevření zajistit přímo z prostředí skriptu, můžeme tak provést s pomocí metod objektu link. Konkrétně to jsou editOriginal (otevře obrázek v jeho výchozí aplikaci), revealInBridge (otevře obrázek v Bridge) a revealInSystem (zobrazí soubor obrázku v Průzkumníkovi nebo Finderu). Pokud se rozhodneme některou z těchto metod použít, měli bychom postupovat opatrně: pozor například na nekontrolované otevření mnoha obrázků v rámci cyklu, které může vést k přetížení paměti a pádu systému.

//Obrázky z pole myHigh dovolí postupně otevřít v jejich výchozí aplikaci
if(myHigh){
    for(i=0;i<myHigh.length;i++){myHigh[i].itemLink.show();myHigh[i].itemLink.editOriginal();alert("Odklikněte po úpravě");}
    }

Podstatně zajímavější než daný způsob, tj. předání k manuálním úpravám, může být zpracování automatizované, s pomocí skriptování dalších komponent Creative Suite (Bridge, Photoshop atp.). Tj. například lze problematické obrázky automaticky v Photoshopu zmenšit na zadané rozměry. Danému tématu se budeme věnovat někdy příště.

Kontrola zobrazení

Zejména při práci s objemnou grafikou přijde vhod možnost přepnutí módu zobrazení (Rychlé - optimized, Typické - typical, Vysoká kvalita - high quality). To lze kontrolovat implicitně, pro celý zobrazovaný dokument a dále individuálně, pro jednotlivé obrázky v dokumentu. Pro implicitní nastavení je zde objekt app.displayPerformancePreferences. Ten určuje výchozí nastavení zobrazení v aplikaci (defaultDisplaySettings) a ignorování či povolení lokálních nastavení zobrazení u jednotlivých obrázků (ignoreLocalSettings) či uložení nastavení do dokumentu pro načtení s tímto dokumentem (persistLocalSettings). Ukázka nastavení:

//Kvalitu zobrazení zobrazíme na optimized (optimalizovaně). Další hodnoty jsou highQuality a typical
app.displayPerformancePreferences.defaultDisplaySettings=ViewDisplaySettings.optimized;
//Dovolíme zachování změn na úrovni obrázku i dokumentu
app.displayPerformancePreferences.ignoreLocalSettings=false;
app.displayPerformancePreferences.persistLocalSettings=false;

Zajímavá je možnost použít individuální nastavení u obrázků pomocí localDisplaySetting. Pokud má například obrázek objem souboru vyšší než je určitá stanovená hodnota (jedno z kritérií, podle kterého se dá přibližně poznat, zda obrázek bude zatěžkávat zobrazení), lze u něj zapnout určitý mód zobrazení takto:

var myDoc=app.activeDocument;
var myLi=app.activeDocument.links;

//U všech obrázků majících objem větší než 100000 bytů zapneme rychlé zobrazení
for(i=0;i<myLi.length;i++){if(myLi[i].size>100000){myLi[i].parent.localDisplaySetting=DisplaySettingOptions.optimized}}

Mimo odstranění problémů s překreslováním se zde naskýtají opět různé možnosti diagnostiky: do určitého zobrazovacího módu lze přepnout obrázky splňující určité kritérium. Obnovení výchozích hodnot u všech obrázků dosáhneme takto:

var myDoc=app.activeDocument;
var myLi=app.activeDocument.links;

for(i=0;i<myLi.length;i++){if(myLi[i].size>0){myLi[i].parent.localDisplaySetting=DisplaySettingOptions.defaultValue}}

Se zobrazením souvisí úzce problematika color managementu. Té se nicméně budeme věnovat až někdy příště, při výkladu o barvách.

Stylizování obrázku

S vloženými obrázky lze manipulovat jako s jinými objekty na úrovni jejich rámečků. Zde bychom tedy ve výkladu opakovali mnoho z toho, co jsme ukázali již v jednom z dřívějších dílů našeho seriálu. Na tomto místě si proto všimněme jen několika vybraných témat.

Často bývá u obrázků použit efekt vrženého stínu. Místo podrobnějšího popisu zde určitě vystačíme s následujícím ukázkovým skriptem:

var myImage=app.selection[0];

myImage.shadowMode=ShadowMode.drop;
myImage.shadowBlendMode=BlendMode.multiply;
myImage.shadowOpacity=75;
myImage.shadowNoise=5;
myImage.shadowXOffset="5pt";
myImage.shadowYOffset="7pt";
myImage.shadowColor="Black";
myImage.shadowBlurRadius="5pt";
myImage.shadowsSpread=14;

Výsledek aplikace závisí na tom, zda je vybrán obrázek nebo jeho rámeček (viz výklad v minulém díle). Odstranění stínu je pak snadno možno provést následovně:

myImage.shadowMode=ShadowMode.none;

V našem příkladu jsme pracovali s jediným obrázkem. Z toho, co jsme již vyložili, si ale čtenář může sám odvodit nespočet postupů, jak se stíny manipulovat u sad obrázků podle různých kritérií.

S pomocí podmínek a cyklů lze velmi snadno stylizovat určeným stínem a také třeba prolnutím okrajů, tahem, výplní apod. určenou skupinu obrázků v dokumentu. Jako příklad nám zde může posloužit skript pro nastavení obarvení a odstínu obrázků v odstínech šedi či černé a bílé.

var myImage=app.selection[0];

if((myImage.space=="Grayscale")||(myImage.space=="Black and White")){
myImage. fillTint=80; myImage.fillColor="Yellow";
    }
else{alert("Nezvolili jste obrázek v odstínech šedi či černobílé")}
}

Jinak bychom neměli zapomenout samozřejmě ani na možnost použít (pouze v InDesignu CS2) objektové styly.

var myImage=app.selection[0];

myImage.applyObjectStyle(app.activeDocument.objectStyles.item("Pokus"));