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:
-
5. září 2024
Matrixmedia - Obsluha a tisk na velkoformátových digitálních tiskárnách
-
30. září 2024
-
4. října 2024
-
14. listopadu 2024
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"
}
}
Obrázky před aplikací skriptu
Obrázky po aplikací skriptu
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"));