Масштабируемая векторная графика (Scalable Vector Graphics)

Фильтры. Часть II

Показывать лекцию целиком
Внимание! Для работы с этой лекцией необходимы учебные файлы, которые Вы можете загрузить здесь.

feFlood

Фильтр позволяет тонировать изображение заданным цветом с произвольной степенью прозрачности. Структура этого фильтра выглядит следующим образом (рис. 8.1):

(рис 8.1) Структура фильтра feFlood

Атрибуты flood-color отвечает за цвет тонировки. Как всегда, по умолчанию принимается черный цвет. Значения атрибут flood-opacity находятся в диапазоне от 0 до 1 (0 – полная прозрачность). Для комбинации изображений используется фильтр feComposite. В табл. 8.1 приводятся примеры использования этого фильтра.

Фильтр feFlood.
Код Вид в браузере
8.1.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="200" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II</title>
     <desc>
          Пример feFlood1svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="#MyImage1" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<image id="MyImage1" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>


</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>

<!--Вспомогательные изображения-->
<image x="10" y="155" width="186" height="125" 
       xlink:href="sea1.jpg"/>
<rect x="10" y="300" width="186" height="125" 
      fill="red" fill-opacity="0.3"/>

</svg>
Описание
Композиция, состоящая из красного прямоугольника (с прозрачностью 0.3) и исходного изображения.
Код Вид в браузере
8.1.2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="200" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II</title>
     <desc>
          Пример feFlood2.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         
         x="10" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.6' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         
         x="10" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.9' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>


</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="155" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter3)"/>

</svg>
Описание
Примеры различной прозрачности. Все остальные атрибуты одинаковы.
Код Описание
8.1.3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="420" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II</title>
     <desc>
          Пример feFlood3.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         
         x="10" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         
         x="10" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="green" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="215" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="blue" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter4" filterUnits="userSpaceOnUse" 
         x="215" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="yellow" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter5" filterUnits="userSpaceOnUse" 
         x="215" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="magenta" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>


</defs>

<rect x="10" y="155" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="215" y="10" width="186" height="125" 
     filter="url(#myFilter3)"/>
<rect x="215" y="155" width="186" height="125" 
     filter="url(#myFilter4)"/>
<rect x="215" y="300" width="186" height="125" 
     filter="url(#myFilter5)"/>

<!--Исходное изображение-->
<image x="10" y="10" width="186" height="125" 
       xlink:href="sea1.jpg"/>

</svg>
Примеры композиций, содержащих различные цвета. Все остальные атрибуты одинаковы.
Вид в браузере
Код Описание
8.1.4
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="420" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II</title>
     <desc>
          Пример feFlood4.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="215" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="10" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0" k2="1" k3="0" k4="0"/>
</filter>


<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="215" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0" k2="0" k3="1" k4="0"/>
</filter>

<filter id="myFilter4" filterUnits="userSpaceOnUse" 
         x="10" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="1" k2="1" k3="1" k4="0"/>
</filter>

<filter id="myFilter5" filterUnits="userSpaceOnUse" 
         x="215" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0" k2="0.5" k3="0.5" k4="0"/>
</filter>


</defs>

<rect x="10" y="155" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="215" y="10" width="186" height="125" 
     filter="url(#myFilter3)"/>
<rect x="215" y="155" width="186" height="125" 
     filter="url(#myFilter4)"/>
<rect x="215" y="300" width="186" height="125" 
     filter="url(#myFilter5)"/>

<!--Исходное изображение-->
<image x="10" y="10" width="186" height="125" 
       xlink:href="sea1.jpg"/>

<!--Подписи-->
<text x="10" y="145" style="fill: black; font-size: 12px">
       sea1.jpg</text>
<text x="215" y="145" style="fill: black; font-size: 12px">
       k1="0.4" k2="0.4" k3="1" k4="0"</text>
<text x="10" y="290" style="fill: black; font-size: 12px">
       k1="0" k2="1" k3="0" k4="0"</text>
<text x="215" y="290" style="fill: black; font-size: 12px">
       k1="0" k2="0" k3="1" k4="0"</text>
<text x="10" y="435" style="fill: black; font-size: 12px">
       k1="1" k2="1" k3="1" k4="0"</text>
<text x="215" y="435" style="fill: black; font-size: 12px">
       k1="0" k2="0.5" k3="0.5" k4="0"</text>

</svg>
Граничные значения атрибутов k1, k2, k3, k4 фильтра feComposite.
Вид в браузере
Код Описание
8.1.5
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="420" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II</title>
     <desc>
          Пример feFlood5.svg
     </desc>

<defs>
<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="arithmetic" 
             k1="0.4" k2="0.4" k3="1" k4="0"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="215" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="over"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="10" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="in"/>
</filter>


<filter id="myFilter4" filterUnits="userSpaceOnUse" 
         x="215" y="155" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="out"/>
</filter>

<filter id="myFilter5" filterUnits="userSpaceOnUse" 
         x="10" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="atop"/>
</filter>

<filter id="myFilter6" filterUnits="userSpaceOnUse" 
         x="215" y="300" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="pict1"/>
<feFlood flood-color="red" flood-opacity='0.3' 
         result='pict2'/>
<feComposite in="pict1" in2="pict2" operator="xor"/>
</filter>


</defs>
<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="155" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter3)"/>
<rect x="215" y="10" width="186" height="125" 
     filter="url(#myFilter4)"/>
<rect x="215" y="155" width="186" height="125" 
     filter="url(#myFilter5)"/>
<rect x="215" y="300" width="186" height="125" 
     filter="url(#myFilter6)"/>

<!--Подписи-->
<text x="10" y="145" style="fill: black; font-size: 12px">
       operator="arithmetic"</text>
<text x="215" y="145" style="fill: black; font-size: 12px">
       operator="over"</text>
<text x="10" y="290" style="fill: black; font-size: 12px">
       operator="in"</text>
<text x="215" y="290" style="fill: black; font-size: 12px">
       operator="out"</text>
<text x="10" y="435" style="fill: black; font-size: 12px">
       operator="atop"</text>
<text x="215" y="435" style="fill: black; font-size: 12px">
       operator="xor"</text>

</svg>
Различные значения атрибута operator.
Вид в браузере

При совместном использовании фильтров feFlood и feComposite достигается не только тонировка изображения, но и смешивание пикселов исходного изображения и верхнего цвета.

feOffset

Фильтр feOffset предназначен для смещения исходного изображения в заданном направлении. Это бывает нужно для создания, например, эффекта падающей тени. Структура фильтра достаточно простая (рис. 8.2):

(рис 8.2) Структура фильтра feOffset

Значения атрибутов dx и dy задают смещение изображения в горизонтальном и вертикальном направлениях. В табл. 8.2 приводятся примеры использования этого фильтра.

Фильтр feOffset.
Код Вид в браузере
8.2.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feOffset1.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="250" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feOffset in="image1" dx="0" dy="0"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>

<!--Рамка вокруг рисунка-->
<rect x="10" y="10" width="186" height="125" 
      style="stroke:green; stroke-width:5; fill:none;stroke-dasharray:5"/>

</svg>
Описание
Значения атрибутов: dx="0" dy="0". Рисунок находится в исходной позиции. Для указания его расположения сверху добавляется пунктирная рамка.
Код Вид в браузере
8.2.2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feOffset2.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="250" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feOffset in="image1" dx="20" dy="10"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>

<!--Рамка вокруг рисунка-->
<rect x="10" y="10" width="186" height="125" 
      style="stroke:green; stroke-width:5; fill:none;stroke-dasharray:5"/>

</svg>
Описание
Значения атрибутов: dx="20" dy="10". Рисунок смещается.
Код Вид в браузере
8.2.3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feOffset3.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="250" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feOffset in="image1" dx="50" dy="30"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>

<!--Рамка вокруг рисунка-->
<rect x="10" y="10" width="186" height="125" 
      style="stroke:green; stroke-width:5; fill:none;stroke-dasharray:5"/>

</svg>
Описание
Значения атрибутов: dx="50" dy="30". Для фильтра myFilter задана область действия при помощи атрибутов следующей строко кода:
<filter id="myFilter" filterUnits="userSpaceOnUse" 
        x="10" y="10" 
        width="250" height="200">
Даже с учетом смещения рисунок все еще попадает в эту область.
Код Вид в браузере
8.2.4
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
  <desc>
          Пример feOffset4.svg
  </desc>
  <defs>
    <filter id="myFilter" filterUnits="userSpaceOnUse" 
            x="10" y="10" width="186" height="125">
      <feImage xlink:href="#MyImage" result="image1"/>
      <feOffset in="image1" dx="50" dy="30"/>
    </filter>
    <image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>
  </defs>

  <rect x="10" y="10" width="186" height="125" 
        filter="url(#myFilter)"/>
  <!--Рамка вокруг рисунка-->
  <rect x="10" y="10" width="186" height="125" 
        style="stroke:green; stroke-width:5; fill:none;stroke-dasharray:5"/>
</svg>
Описание
Величина смещения совпадает с предыдущим примером. Но здесь область действия фильтра меньше:
<filter id="myFilter" filterUnits="userSpaceOnUse" 
        x="10" y="10" width="186" height="125">
В результате рисунок "отсекается" по границе области.

Мы рассмотрели применение фильтра feOffset в чистом виде, без других фильтров. Попробуйте самостоятельно создать сочетание этого фильтра с feGaussianBlur для получения эффекта падающей тени в заданном направлении.

feMorphology

Фильтр feMorphology предназначен для художественной обработки изображений. Его структура имеет следующий вид (рис. 8.3):

(рис 8.3) Структура фильтра feMorphology

Атрибут operator содержит два значения erode (сжатие) и dilate (растяжение). Первое значение сближает пиксели изображения на величину, определяемую атрибутом radius. Второе значение, наоборот, растягивает пикселы. Направление смещение можно задавать в виде отдельных значений горизонтальной и вертикальной составляющих. В табл. 8.3 приводятся примеры использования этого фильтра.

Фильтр feMorphology
Код Вид в браузере
8.3.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="210" height="150" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology1.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="200" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feMorphology in="image1" radius="0" operator="erode"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>


<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>


</svg>
Описание
Применение фильтра с атрибутом radius="0". Изображение не изменилось.
Код Вид в браузере
8.3.2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="210" height="150" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology2.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="200" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feMorphology in="image1" radius="2,2" operator="erode"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>


<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>


</svg>
Описание
Применение фильтра с атрибутом radius="2,2". Искажение картинки в горизонтальном и вертикальном направлениях.
Код Вид в браузере
8.3.3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="210" height="150" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology3.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="200" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feMorphology in="image1" radius="10,0" operator="erode"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>


<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>


</svg>
Описание
Применение фильтра с атрибутом radius="10,0". Получение эффекта смазывания в горизонтальном направлении.
Код Вид в браузере
8.3.4
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="210" height="150" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology4.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="200" height="200">
<feImage xlink:href="#MyImage" result="image1"/>
<feMorphology in="image1" radius="0,10" operator="erode"/>
</filter>
<image id="MyImage" x="10" y="10" 
       width="186" height="125" xlink:href="sea1.jpg"/>

</defs>


<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>


</svg>
Описание
Применение фильтра с атрибутом radius="0,10". Получение эффекта смазывания в вертикальном направлении.
Код Описание
8.3.5
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="420" height="600" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology5.svg
     </desc>

<defs>

<filter id="myFilterErode1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="0" operator="erode"/>
</filter>

<filter id="myFilterErode2" filterUnits="userSpaceOnUse" 
         x="10" y="135" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="2,2" operator="erode"/>
</filter>

<filter id="myFilterErode3" filterUnits="userSpaceOnUse" 
         x="10" y="260" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="10,0" operator="erode"/>
</filter>

<filter id="myFilterErode4" filterUnits="userSpaceOnUse" 
         x="10" y="385" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="0,10" operator="erode"/>
</filter>

<filter id="myFilterDilate1" filterUnits="userSpaceOnUse" 
         x="206" y="10" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="0" operator="dilate"/>
</filter>

<filter id="myFilterDilate2" filterUnits="userSpaceOnUse" 
         x="206" y="135" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="2,2" operator="dilate"/>
</filter>

<filter id="myFilterDilate3" filterUnits="userSpaceOnUse" 
         x="206" y="260" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="10,0" operator="dilate"/>
</filter>

<filter id="myFilterDilate4" filterUnits="userSpaceOnUse" 
         x="206" y="385" width="186" height="125">
<feImage xlink:href="sea1.jpg" result="image1"/>
<feMorphology in="image1" radius="0,10" operator="dilate"/>
</filter>


</defs>


<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilterErode1)"/>
<rect x="10" y="135" width="186" height="125" 
     filter="url(#myFilterErode2)"/>
<rect x="10" y="260" width="186" height="125" 
     filter="url(#myFilterErode3)"/>
<rect x="10" y="385" width="186" height="125" 
     filter="url(#myFilterErode4)"/>

<rect x="206" y="10" width="186" height="125" 
     filter="url(#myFilterDilate1)"/>
<rect x="206" y="135" width="186" height="125" 
     filter="url(#myFilterDilate2)"/>
<rect x="206" y="260" width="186" height="125" 
     filter="url(#myFilterDilate3)"/>
<rect x="206" y="385" width="186" height="125" 
     filter="url(#myFilterDilate4)"/>


<!--Подписи-->
<text x="15" y="25" style="fill: white; font-size: 12px">
       radius="0" operator="erode"</text>
<text x="15" y="150" style="fill: white; font-size: 12px">
       radius="2,2" operator="erode"</text>
<text x="15" y="275" style="fill: black; font-size: 12px">
       radius="10,0" operator="erode"</text>
<text x="15" y="405" style="fill: white; font-size: 12px">
       radius="0,10" operator="erode"</text>
     
<text x="211" y="25" style="fill: white; font-size: 12px">
       radius="0" operator="dilate"</text>
<text x="211" y="150" style="fill: white; font-size: 12px">
       radius="2,2" operator="dilate"</text>
<text x="211" y="275" style="fill: black; font-size: 12px">
       radius="10,0" operator="dilate"</text>
<text x="211" y="405" style="fill: white; font-size: 12px">
       radius="0,10" operator="dilate"</text>


</svg>
Сопоставление нескольких изображений с применением значений erode и dilate атрибута operator. При значении erode заметно искажение размеров самого изображения.
Вид в браузере
Код Вид в браузере
8.3.6
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="300" height="250" viewBox="0 0 700 500" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feMorphology6.svg
     </desc>

<defs>
<filter id="Erode3">
      <feMorphology operator="erode" in="SourceGraphic" radius="3"/>
    </filter>
    <filter id="Erode6">
      <feMorphology operator="erode" in="SourceGraphic" radius="6"/>
    </filter>
    <filter id="Dilate3">
      <feMorphology operator="dilate" in="SourceGraphic" radius="3"/>
    </filter>
    <filter id="Dilate6">
      <feMorphology operator="dilate" in="SourceGraphic" radius="6"/>
    </filter>
  </defs>
  <rect fill="none" stroke="blue" stroke-width="3"  
        
         x="5" y="5" width="695" height="495"/>
  <g enable-background="new" >
    <g font-family="Verdana" font-size="75" 
              fill="none" stroke="black" stroke-width="6" >
<text x="50" y="90">
       Unfiltered</text>
<text x="50" y="180" 
     filter="url(#Erode3)" >Erode radius 3</text>
<text x="50" y="270" filter="url(#Erode6)">Erode radius 6</text>
<text x="50" y="360" filter="url(#Dilate3)">Dilate radius 3</text>
<text x="50" y="450" filter="url(#Dilate6)">Dilate radius 6</text>
    </g>
  </g>
</svg>
Описание
Значение erode делает текст тонким, значение dilate делает толстым.

feDisplacementMap

Фильтр feDisplacementMap позволяет изменять поверхность рисунка, используя в качестве основы другой рисунок. Таким образом, из растровой фотографии можно получить, к примеру, изображение развевающегося флага. Структура этого фильтра выглядит так (рис. 8.4):

(рис 8.4) Структура фильтра feDisplacementMap

Атрибуты xChannelSelector и yChannelSelector определяют смещение в горизонтальном и вертикальном направлениях, причем это смещение можно задавать в отдельном канале RGB – модели. По умолчанию принимается канал прозрачности A. Атрибут scale определяет величину смещения ( в пикселях). В табл. 8.4 приводятся примеры использования фильтра.

Фильтра feDisplacementMap
Код Вид в браузере
8.4.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
       

<svg width="250" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap1.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="G" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter)"/>

<!--Вставка исходных изображений-->
<image id="MyImage1" x="10" y="150" 
       width="186" height="125" xlink:href="collage.png"/>
<image id="MyImage2" x="10" y="300"  
       width="186" height="125" xlink:href="stripe.png"/>

</svg>
Описание
Исходные изображения содержат прозрачные области (см. рис. 7.8). Отдельные области верхнего изображения смещаются на величину scale="10", повторяя структуру нижнего изображения. Для горизонтального направления выделяется канал G, для вертикального A.
Код Вид в браузере
8.4.2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="450" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap2.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10"  
                   xChannelSelector="G" yChannelSelector="A"
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="10" y="150" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="20" 
                   xChannelSelector="G" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="10" y="300" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="30" 
                   xChannelSelector="G" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="150" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter3)"/>

</svg>
Описание
Смещение изображения на 10, 20 и 30 пикселей.
Код Вид в браузере
8.4.3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="600" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap3.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="10" y="150" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="B" yChannelSelector="B" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="10" y="300" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="G" yChannelSelector="G" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter4" filterUnits="userSpaceOnUse" 
         x="10" y="450" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="R" yChannelSelector="R" 
                   in2="image2" in="image1"/>
</filter>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="150" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter3)"/>
<rect x="10" y="450" width="186" height="125" 
     filter="url(#myFilter4)"/>

</svg>
Описание
Смещение изображения в сочетаниях каналов A-A, B-B, G-G, R-R.
Код Вид в браузере
8.4.4
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="600" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap4.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="B" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="10" y="150" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="B" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter3" filterUnits="userSpaceOnUse" 
         x="10" y="300" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="G" 
                   in2="image2" in="image1"/>
</filter>

<filter id="myFilter4" filterUnits="userSpaceOnUse" 
         x="10" y="450" width="186" height="125">
<feImage xlink:href="collage.png" result="image1"/>
<feImage xlink:href="stripe.png" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="R" 
                   in2="image2" in="image1"/>
</filter>

</defs>

<rect x="10" y="10" width="186" height="125" 
     filter="url(#myFilter1)"/>
<rect x="10" y="150" width="186" height="125" 
     filter="url(#myFilter2)"/>
<rect x="10" y="300" width="186" height="125" 
     filter="url(#myFilter3)"/>
<rect x="10" y="450" width="186" height="125" 
     filter="url(#myFilter4)"/>

</svg>
Описание
Смещение изображения в сочетаниях каналов A-B, B-A, A-G, A-R.
Код Вид в браузере
8.4.5
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="290" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap5.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="279" height="187.5">
<feImage xlink:href="#MyImage1" result="image1"/>
<feImage xlink:href="#MyImage2" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="B" yChannelSelector="B" 
                   in2="image2" in="image1"/>
</filter>
<image id="MyImage1" width="279" height="187.5" 
       xlink:href="sea1.jpg"/>

<g id="MyImage2">

<circle cx="145" cy="100" r="90" 
        stroke="none" fill="white"/>
<circle cx="145" cy="100" r="80" 
        stroke="none" fill="red"/>
<circle cx="145" cy="100" r="70" 
        stroke="none" fill="white"/>
<circle cx="145" cy="100" r="60" 
        stroke="none" fill="red"/>
<circle cx="145" cy="100" r="50" 
        stroke="none" fill="white"/>
<circle cx="145" cy="100" r="40" 
        stroke="none" fill="red"/>
<circle cx="145" cy="100" r="30" 
        stroke="none" fill="white"/>
<circle cx="145" cy="100" r="20" 
        stroke="none" fill="red"/>
<circle cx="145" cy="100" r="10" 
        stroke="none" fill="white"/>
</g>
</defs>

<rect x="10" y="10" width="279" height="187.5" 
     filter="url(#myFilter)"/>

</svg>
Описание
В качестве нижнего изображения применяется группа колец. Заметно отсечение и подъем фрагментов изображения в каждом кольце.
Код Вид в браузере
8.4.6
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="290" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap6.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="279" height="187.5">
<feImage xlink:href="#MyImage1" result="image1"/>
<feImage xlink:href="#MyImage2" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="B" yChannelSelector="B" 
                   in2="image2" in="image1"/>
</filter>
<image id="MyImage1" width="279" height="187.5" xlink:href="sea1.jpg"/>

<radialGradient id="MyGradient">
     <stop offset="10%" stop-color="white"/>
     <stop offset="20%" stop-color="red"/>
     <stop offset="30%" stop-color="white"/>
     <stop offset="40%" stop-color="red"/>
     <stop offset="50%" stop-color="white"/>
     <stop offset="60%" stop-color="red"/>
     <stop offset="70%" stop-color="white"/>
     <stop offset="80%" stop-color="red"/>
     <stop offset="100%" stop-color="white"/>
       
</radialGradient>


<g id="MyImage2">

<circle cx="145" cy="100" r="90" fill="url(#MyGradient)"/>
</g>

</defs>

<rect x="10" y="10" width="279" height="187.5" 
     filter="url(#myFilter)"/>

</svg>
Описание
В качестве нижнего изображения применяется система колец с градиентной заливкой. Результат напоминает круги на воде.
Код Вид в браузере
8.4.7
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="290" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap7.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="279" height="187.5">
<feImage xlink:href="#MyImage1" result="image1"/>
<feImage xlink:href="#MyImage2" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="B" yChannelSelector="B" 
                   in2="image2" in="image1"/>
</filter>
<image id="MyImage1" width="279" height="187.5" xlink:href="sea1.jpg"/>

    <linearGradient id="MyGradient">
      <stop offset="0%" stop-color="white"/>
      <stop offset="10%" stop-color="red"/>
      <stop offset="20%" stop-color="white"/>
       <stop offset="30%" stop-color="red"/>
      <stop offset="40%" stop-color="white"/>
       <stop offset="50%" stop-color="red"/>
      <stop offset="60%" stop-color="white"/>
      <stop offset="70%" stop-color="red"/>
       <stop offset="80%" stop-color="white"/>
       <stop offset="90%" stop-color="red"/>
      <stop offset="100%" stop-color="white"/>
    </linearGradient>

<g id="MyImage2">

<rect x="0" y="0" width="290" height="200" fill="url(#MyGradient)"/>
</g>

</defs>

<rect x="10" y="10" width="279" height="187.5" 
     filter="url(#myFilter)"/>

</svg>
Описание
В качестве нижнего изображения применяется система вертикальных полос с линейным градиентом.
Код Вид в браузере
8.4.8
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="290" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap8.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="279" height="187.5">
<feImage xlink:href="#MyImage1" result="image1"/>
<feImage xlink:href="#MyImage2" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

<pattern id="MyPattern" x="10" y="10" 
         width="22" height="22" 
patternUnits="userSpaceOnUse"> 
<circle cx="11" cy="11" r="10" 
        fill="red" stroke="black"/>
</pattern> 

<rect id="MyImage2" x="10" y="10" 
      width="279" height="187.5" 
      fill="url(#MyPattern)"/>

<image id="MyImage1" width="279" height="187.5" 
       xlink:href="sea1.jpg"/>

</defs>

<rect x="10" y="10" width="279" height="187.5" 
      filter="url(#myFilter)"/>

</svg>
Описание
В качестве нижнего изображения применяется прмоугольник, залитый паттерном из окружностей.
Код Вид в браузере
8.4.9
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="290" height="200" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feDisplacementMap9.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="10" y="10" width="279" height="187.5">
<feImage xlink:href="#MyImage1" result="image1"/>
<feImage xlink:href="#MyImage2" result="image2"/>
<feDisplacementMap scale="10" 
                   xChannelSelector="A" yChannelSelector="A" 
                   in2="image2" in="image1"/>
</filter>

<pattern id="MyPattern" x="10" y="10" 
         width="22" height="22" 
         patternUnits="userSpaceOnUse"> 
<rect x="11" y="11" width="10" height="10" 
      fill="red" stroke="black"/>
</pattern> 

<rect id="MyImage2" x="10" y="10" 
      width="279" height="187.5" fill="url(#MyPattern)"/>

<image id="MyImage1" width="279" height="187.5" 
       xlink:href="sea1.jpg"/>

</defs>

<rect x="10" y="10" width="279" height="187.5" 
     filter="url(#myFilter)"/>

</svg>
Описание
В качестве нижнего изображения применяется прмоугольник, залитый паттерном из квадратиков.

feTile

В пятой Лекции мы проходили элемент pattern, задача которого заключалась в получении мозаики для оформления фигур. Другой способ получения мозаики заключается в применение фильтра feTile, структура которого имеет очень простой вид (рис. 8.5):

(рис 8.5) Структура фильтра feTitle

Фильтр принимает исходное изображение и размножает его в пределах области, определяемой атрибутами x, y, width и height. Для задания изображения или его части применяется фильтр feImage. В табл. 8.5 приводятся примеры использования этого фильтра.

Фильтр feTile.
Код Вид в браузере
8.5.1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="350" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feTile1.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="250" height="200">
<feImage x="5" y="40" width="40" height="45" 
         xlink:href="#MyImage" result="image"/>
<feTile x="0" y="0" width="250" height="200" 
        in="image"/>
</filter>

<image id="MyImage" width="186" height="125" 
       xlink:href="collage.png"/>

</defs>

<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter)"/>

<!--Вспомогательные изображения-->

<image x="30" y="200" width="186" height="125"
       xlink:href="collage.png"/>
<rect x="35" y="240" width="40" height="45" 
      style="fill:none;stroke:blue; stroke-width:2"/>

</svg>
Описание
Исходное изображение "collage.png" вставлено в документ при помощи элемента image. Область мозаики (голова утенка) определяется внутри фильтра feImage:
<feImage x="5" y="40" 
         width="40" height="45" xlink:href="#MyImage" 
         result="image"/>
Далее этот фрагмент копируется на области 250 х 200 пикселей:
<feTile x="0" y="0" 
          width="250" height="200" in="image"/>
Код Вид в браузере
8.5.2
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="350" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feTile2.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="250" height="200">
<feImage x="120" y="38" width="60" height="45" 
         xlink:href="#MyImage" result="image"/>
<feTile x="0" y="0" width="250" height="200" 
        in="image"/>
</filter>

<image id="MyImage" width="186" height="125" 
       xlink:href="collage.png"/>

</defs>

<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter)"/>

<!--Вспомогательные изображения-->

<image x="30" y="200" width="186" height="125" 
       xlink:href="collage.png"/>
<rect x="150" y="238" width="60" height="45" 
      style="fill:none;stroke:blue; stroke-width:2"/>

</svg>
Описание
Определение другой части изображения для мозаики.
Код Вид в браузере
8.5.3
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="350" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feTile3.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="250" height="200">
<feImage x="0" y="0" width="62" height="41,67" 
         xlink:href="#MyImage" result="image"/>
<feTile x="0" y="0" width="250" height="200" 
        in="image"/>
</filter>

<image id="MyImage" width="62" height="41,67" 
       xlink:href="collage.png"/>

</defs>

<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter)"/>

<!--Вспомогательные изображения-->

<image x="30" y="210" width="186" height="125" 
       xlink:href="collage.png"/>
<rect x="30" y="210" width="186" height="125" 
      style="fill:none;stroke:blue; stroke-width:2"/>

</svg>
Описание
Использование для мозаики целого изображения.
Код Вид в браузере
8.5.4
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="350" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feTile4.svg
     </desc>

<defs>

<filter id="myFilter" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="150" height="120">
<feImage x="0" y="0" width="62" height="41,67" 
         xlink:href="#MyImage" result="image"/>
<feTile x="0" y="0" width="250" height="200" 
        in="image"/>
</filter>

<image id="MyImage" width="62" height="41,67" 
       xlink:href="collage.png"/>

</defs>

<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter)"/>

<!--Вспомогательные изображения-->

<image x="30" y="210" width="186" height="125" 
       xlink:href="collage.png"/>
<rect x="30" y="210" width="186" height="125" 
      style="fill:none;stroke:blue; stroke-width:2"/>

</svg>
Описание
Область действия фильтра ограничивается размерами, задаваемыми в элементе filter:
<filter id="myFilter" filterUnits="userSpaceOnUse" 
        x="0" y="0" width="150" height="120">
Код Вид в браузере
8.5.5
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
 "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="250" height="350" 
     xmlns="http://www.w3.org/2000/svg" version="1.1" >
     <title> Лекция 8. Фильтры. Часть II </title>
     <desc>
          Пример feTile5.svg
     </desc>

<defs>

<filter id="myFilter1" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="250" height="200">
<feImage x="5" y="40" width="40" height="45" 
         xlink:href="#MyImage" result="image"/>
<feTile x="0" y="0" width="125" height="200" 
        in="image"/>
</filter>

<filter id="myFilter2" filterUnits="userSpaceOnUse" 
         x="0" y="0" width="250" height="200">
<feImage x="120" y="38" width="60" height="45" 
         xlink:href="#MyImage" result="image"/>
<feTile x="125" y="0" width="125" height="200" 
        in="image"/>
</filter>


<image id="MyImage" width="186" height="125" 
       xlink:href="collage.png"/>

</defs>

<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter1)"/>
<rect x="0" y="0" width="290" height="200" 
     filter="url(#myFilter2)"/>

<!--Вспомогательные изображения-->

<image x="30" y="200" width="186" height="125" 
       xlink:href="collage.png"/>
<rect x="35" y="240" width="40" height="45" 
      style="fill:none;stroke:blue; stroke-width:2"/>
<rect x="150" y="238" width="60" height="45" 
      style="fill:none;stroke:blue; stroke-width:2"/>

</svg>
Описание
Комбинация двух фильтров, для каждого из которых определена своя область действия.
Вернуться к учебному плану