Reklama

zonerbooks.cz | zoner.cz | czechia.com | regzone.cz | inshop.cz | inmail.cz | zonerpress.cz | zonerantivirus.com | zonerama.cz

interval.cz

Kurz SVG - vyplňování 2.

03. 08. 2004 | Martin Hejral | Webová grafika | Komentáře: 0

V předchozím článku jsme si probrali základy vyplňování vektorových objektů ve Scalable Vektor Graphics. Tentokrát se budeme věnovat té zajímavější části tématu - přechodům barev, používání textur a nastavování průhlednosti objektů.

Dědičnost atributů

Dědičnost probíhá obdobně jako například u stylů v HTML. Jen si musíte dobře uvědomit, že vyplňování samotné se aplikuje na každý synovský objekt individuálně - nikdy ne na celou skupinu (na nadřazený rodičovský objekt)!

Konstantní barva

Hodnoty barev lze zapisovat v prostoru sRGB - shodně s HTML nebo CSS - například stroke="blue" nebo fill="#FF8080". Norma podporuje i správu barev pomocí ICC profilů.

Přechody barev

Teoreticky definovat přechod barev můžeme třeba následovně: "Mějme dva prostorově oddělené body se dvěma různými barvami. Přechod pak vznikne tím, jak se po spojnici těchto dvou bodů mění (přechází) barva prvního bodu v barvu druhého bodu."

SVG umožňuje ovšem daleko lepší triky - krom toho, že přechody mohou být lineární nebo kruhové, lze na úsečce mezi krajními definičními body SVG přechodu rozmístit libovolnou posloupnost zlomových (přechodových) barevných bodů a vyrobit si tak třeba duhu. Navíc jsou možné různé způsoby zrcadlení či opakování definované základní posloupnosti.

Přechodový (zlomový) bod - element stop

Elementy stop určují barvu ve zlomových bodech a musí být proto v přechodu minimálně dva! Mohou nést následující atributy:

  • stop-color - barva
  • stop-opacity - průhlednost (může se libovolně měnit podél přechodu, stejně jako jakýkoli jiný z RGB kanálů!)
  • offset - definuje umístění bodu na úsečce mezi dvěma hraničními body přechodu, proto bude většinou v rozsahu 0 až 1, respektive 0 až 100 % (pokud nebyl změněn výchozí souřadnicový systém - viz níže)

Lineární přechod - element linearGradient

Element linearGradient je používán pro definici lineárního přechodu. Jeho obsahem je sada elementů stop. Může nést následující atributy:

  • id - jméno pro pozdější odkazování
  • gradientUnits - (nepovinný) vybere jeden ze dvou možných souřadnicových systémů pro udávání hodnot atributů ("x1", "y1", "x2", "y2") definujících vektor přechodu:
    • "userSpaceOnUse" - použije se aktuální systém souřadnic právě vyplňovaného objektu
    • "objectBoundingBox" - tato výchozí hodnota definuje souřadnicový systém orientovaný uvnitř rámečku ohraničujícího konkrétní objekt, na který se přechod aplikuje - souřadnice (0,0), respektive (0%,0%), jsou v levém horním rohu a (1,1), respektive (100%,100%), v pravém spodním rohu ohraničení vyplňovaného objektu

    Podobná konvence se v udávání rozměrů, vztažených k nějakému objektu, opakuje na mnoha místech, dobře si ji zapamatujte!

  • x1, y1, x2, y2 - (nepovinné) dva páry souřadnic určují úsečku, podél které se přechod vykresluje; výchozí hodnoty: (0,0) a (1,1) - ve většině aplikací je proto ani nebudete muset nastavovat
  • gradientTransform - (nepovinný) seznam dodatečných souřadnicových transformací, jež se aplikují na přechod
  • spreadMethod - (nepovinný) určuje opakování nadefinovaného přechodu - 1x, zrcadlení nebo nekonečné opakování - hodnoty: pad (výchozí), reflect, repeat
  • xlink:href - (nepovinný) odkaz na jiný přechod (můžete tak složit komplexní sekvenci barev z několika jednodušších přechodů)

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="320px" height="160px" viewBox="0 0 800 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>5.9.2 Linear gradient paint server</title>
  <g>
    <defs>
      <linearGradient id="MyGradient">
        <stop offset="5%" stop-color="#F60" />
        <stop offset="95%" stop-color="#FF6" />
      </linearGradient>
    </defs>
    <!-- zde je vykreslen prechod -->
    <rect fill="url(#MyGradient)" stroke="black" stroke-width="5"
    x="100" y="100" width="600" height="200"/>
    <!-- obrys platna -->
    <rect fill="none" stroke="blue"
          x="1" y="1" width="798" height="398"/>
  </g>
</svg>

Zobrazení lineárního přechodu
Zobrazení lineárního přechodu (originální SVG, cca 1 kB)

Kruhový přechod - element radialGradient

Element radialGradient je používán pro definici kruhového přechodu. Jeho obsahem je sada elementů stop. Může nést následující atributy:

  • id - jméno pro pozdější odkazování
  • gradientUnits - (nepovinný) vybere jeden ze dvou možných souřadnicových systémů pro udávání atributů ("cx", "cy", "r", "fx", "fy") definujících kružnice přechodu:
    • "userSpaceOnUse" - použije se aktuální systém souřadnic právě vyplňovaného objektu
    • "objectBoundingBox" - tato výchozí hodnota definuje souřadnicový systém orientovaný uvnitř rámečku ohraničujícího konkrétní objekt, na který se přechod aplikuje - souřadnice (0,0), respektive (0%,0%), jsou v levém horním rohu a (1,1), respektive (100%,100%), v pravém spodním rohu ohraničení vyplňovaného objektu
  • cx, cy, r - (nepovinné) definují vnější, největší kružnici v přechodu; výchozí hodnoty: 50%
  • fx, fy - (nepovinný) středový bod přechodu, kterému odpovídá přechodový bod na 0%; výchozí hodnota = "cx", "cy"
  • gradientTransform - (nepovinný) seznam dodatečných souřadnicových transformací, jež se aplikují na přechod
  • spreadMethod - (nepovinný) určuje opakování nadefinovaného přechodu - 1x, zrcadlení nebo nekonečné opakování - hodnoty: pad (výchozí), reflect, repeat
  • xlink:href - (nepovinný) odkaz na jiný přechod (můžete tak složit komplexní sekvenci barev z několika jednodušších přechodů)

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="320px" height="160px" viewBox="0 0 800 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>5.9.3 Radial gradient paint server</title>
  <g>
    <defs>
      <radialGradient id="MyGradient"
          gradientUnits="userSpaceOnUse"
          cx="400" cy="200" r="300" fx="400" fy="200">
        <stop offset="0%" stop-color="red" />
        <stop offset="50%" stop-color="blue" />
        <stop offset="100%" stop-color="red" />
      </radialGradient>
    </defs>
    <!-- vykresleni prechodu zde -->
    <rect fill="url(#MyGradient)" stroke="black" stroke-width="5"
          x="100" y="100" width="600" height="200"/>
    <!-- obrys platna -->
    <rect fill="none" stroke="blue"
          x="1" y="1" width="798" height="398"/>
  </g>
</svg>

Zobrazení kruhového přechodu
Zobrazení kruhového přechodu (originální SVG, cca 2 kB)

Vzorky alias textury

Element pattern slouží k vyplnění dané plochy předdefinovaným grafickým prvkem, který je pravidelně rozmnožen (replikován) s konstantním opakováním podél obou os (X, Y) tolikráte, aby vyplnil celou definovanou plochu. Může nést následující atributy:

  • patternUnits - (nepovinný) vybere jeden ze dvou možných souřadnicových systémů pro atributy ("x", "y", "width", "height") definující replikovaný vzorek:
    • "userSpaceOnUse" - použije se aktuální systém souřadnic právě vyplňovaného objektu
    • "objectBoundingBox" - tato výchozí hodnota definuje souřadnicový systém orientovaný uvnitř rámečku ohraničujícího konkrétní objekt, na který se přechod aplikuje - souřadnice (0,0), respektive (0%,0%), jsou v levém horním rohu a (1,1), respektive (100%,100%), v pravém spodním rohu ohraničení vyplňovaného objektu
  • patternContentUnits - (nepovinný) definuje souřadnicový systém pro obsah vzorku (pokud byste současně nadefinovali i viewBox, bude patternContentUnits ignorován), význam hodnot viz atribut patternUnits
  • patternTransform - (nepovinný) seznam dodatečných souřadnicových transformací, jež se aplikují na texturu
  • xlink:href - (nepovinný) odkaz na jinou texturu (můžete tak složit komplexní texturu z několika jednodušších)

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
  "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg width="320px" height="160px" viewBox="0 0 800 400"
     xmlns="http://www.w3.org/2000/svg" version="1.1">
  <title>5.10 Ukazka vzorku</title>
  <defs>
    <pattern id="TrianglePattern" patternUnits="userSpaceOnUse"
             x="0" y="0" width="100" height="100"
             viewBox="0 0 10 10" >
      <path d="M 1 1 L 9 1 L 5 9 z" fill="red" stroke="blue" />
    </pattern>
  </defs>
  <!-- elipsa vyplnena vzorkem -->
  <ellipse fill="url(#TrianglePattern)"
           stroke="violet" stroke-width="5"
           cx="400" cy="200" rx="350" ry="150" />
  <!-- obrys platna -->
  <rect fill="none" stroke="blue"
        x="1" y="1" width="798" height="398"/>
</svg>

Zobrazení SVG textury
Zobrazení SVG textury (originální SVG, cca 1 kB)

Průhlednost objektu a skupiny

Atribut "opacity" určuje celkovou průhlednost jednoho prvku nebo celé skupiny - lze jej přidat například i do elementu g. Existuje ovšem zásadní rozdíl mezi průhlednostmi popsanými v předchozích článcích a touto, určenou v atributu "opacity". Zatímco totiž ty předcházející se projevily ihned v místě zápisu v bezprostřední akci vykreslení, tuto můžeme chápat jako jakýsi postprocessing (následné zpracování). Teprve až poté, co je vykreslen celý objekt nebo skupina, je pomocná grafická paměť sloučena s pozadím s přihlédnutím k hodnotě "opacity". Pro lepší pochopení doporučuji znovu prostudovat zobrazovací a vykreslovací model SVG.

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
  "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg width="320px" viewBox="0 0 1200 350"
     xmlns="http://www.w3.org/2000/svg">
  <title>5.11 Vliv atributu 'opacity' na skupinu</title>
  <rect x="100" y="100" width="1000" height="150" fill="blue" />
  <!-- cervene kruhy se zvetsujici se pruhlednosti -->
  <circle cx="200" cy="100" r="50" fill="red" opacity="1" />
  <circle cx="400" cy="100" r="50" fill="red" opacity=".8" />
  <circle cx="600" cy="100" r="50" fill="red" opacity=".6" />
  <circle cx="800" cy="100" r="50" fill="red" opacity=".4" />
  <circle cx="1000" cy="100" r="50" fill="red" opacity=".2" />
  <!-- nasleduje demonstrace 'opacity' na prvku 'g' -->
  <g opacity="1" >
    <circle cx="182.5" cy="250" r="50" fill="red" opacity="1" />
    <circle cx="217.5" cy="250" r="50" fill="green" opacity="1" />
  </g>
  <!-- zde SPRAVNE MUSI zeleny kruh zcela vyriznout cerveny -->
  <g opacity=".5" >
    <circle cx="382.5" cy="250" r="50" fill="red" opacity="1" />
    <circle cx="417.5" cy="250" r="50" fill="green" opacity="1" />
  </g>
  <!-- zeleny kruh umisten NAD cervenym -->
  <g opacity="1" >
    <circle cx="582.5" cy="250" r="50" fill="red" opacity=".5" />
    <circle cx="617.5" cy="250" r="50" fill="green" opacity=".5" />
  </g>
  <!-- zeleny kruh umisten POD cervenym -->
  <g opacity="1" >
    <circle cx="817.5" cy="250" r="50" fill="green" opacity=".5" />
    <circle cx="782.5" cy="250" r="50" fill="red" opacity=".5" />
  </g>
  <!-- zde SPRAVNE MUSI zeleny kruh zcela vyriznout cerveny -->
  <g opacity=".5" >
    <circle cx="982.5" cy="250" r="50" fill="red" opacity=".5" />
    <circle cx="1017.5" cy="250" r="50" fill="green" opacity="1" />
  </g>
  <!-- obrys platna -->
  <rect x="2" y="2" width="1196" height="346"
        fill="none" stroke="blue" />
</svg>

Vliv atributu "opacity" na skupinu
Vliv atributu "opacity" na skupinu (originální SVG, cca 1 kB)

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.


Reklama


Další aktuální články na interval.cz

Tematicky související články

Dejte vědět i ostatním o článku

Diskuse (počet komentářů: 0)

Buďte prvním návštěvníkem, který přidá nový komentář.

Přidat nový komentář

Jméno a e-mail jsou nepovinné. Příspěvky obsahující odkaz jsou moderovány.

Zoner AntiVirus Free pro Android
zabezpečte si svůj smartphone, zdarma
Profesionální eshop Zoner inShop od 990 Kč.
Reklama
Reklama

Syndikace

hledáme nové autory | redakce interval.cz | reklama na interval.cz

© ZONER software, a.s., všechna práva vyhrazena, interval.cz dodržuje právní předpisy o ochraně osobních údajů. Powered by WordPress.