Эффекты фильтров
Бывают ситуации, когда базовых фигур недостаточно для достижения желаемого эффекта. Например, тень от объекта нельзя разумно создать с помощью сочетания градиентов. Фильтры — это механизм SVG для создания сложных эффектов.
Базовый пример — добавление эффекта размытия к SVG-контенту. Хотя базовое размытие можно получить с помощью градиентов, для достижения чего-то большего нужен фильтр размытия.
Пример
Фильтры определяются элементом <filter>, который должен быть размещён в разделе <defs> вашего SVG-файла. Между тегами фильтра располагается список примитивов: базовые операции, которые строятся на основе предыдущих операций (например, размытие, добавление эффекта освещения и т. д.). Для применения созданного фильтра к графическому элементу нужно установить атрибут filter.
<svg width="250" viewBox="0 0 200 85" xmlns="http://www.w3.org/2000/svg" version="1.1"> <defs> <!-- Filter declaration --> <filter id="MyFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="120"> <!-- offsetBlur --> <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur" /> <feOffset in="blur" dx="4" dy="4" result="offsetBlur" /> <!-- litPaint --> <feSpecularLighting in="blur" surfaceScale="5" specularConstant=".75" specularExponent="20" lighting-color="#bbbbbb" result="specOut"> <fePointLight x="-5000" y="-10000" z="20000" /> </feSpecularLighting> <feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut" /> <feComposite in="SourceGraphic" in2="specOut" operator="arithmetic" k1="0" k2="1" k3="1" k4="0" result="litPaint" /> <!-- merge offsetBlur + litPaint --> <feMerge> <feMergeNode in="offsetBlur" /> <feMergeNode in="litPaint" /> </feMerge> </filter> </defs> <!-- Graphic elements --> <g filter="url(#MyFilter)"> <path fill="none" stroke="#D90000" stroke-width="10" d="M50,66 c-50,0 -50,-60 0,-60 h100 c50,0 50,60 0,60z" /> <path fill="#D90000" d="M60,56 c-30,0 -30,-40 0,-40 h80 c30,0 30,40 0,40z" /> <g fill="#FFFFFF" stroke="black" font-size="45" font-family="Verdana"> <text x="52" y="52">SVG</text> </g> </g> </svg>
Шаг 1
<feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur" />
<feGaussianBlur> принимает in "SourceAlpha", который является альфа-каналом исходного изображения; применяет размытие в 4; и сохраняет result в временном буфере с именем "blur".
Шаг 2
<feOffset in="blur" dx="4" dy="4" result="offsetBlur" />
<feOffset> принимает in "blur", который мы ранее создали; смещает результат на "4" вправо и "4" вниз; и сохраняет result в буфер "offsetBlur". Эти две первые операции создали тень.
Шаг 3
<feSpecularLighting in="offsetBlur" surfaceScale="5" specularConstant=".75" specularExponent="20" lighting-color="#bbbbbb" result="specOut"> <fePointLight x="-5000" y="-10000" z="20000" /> </feSpecularLighting>
<feSpecularLighting> принимает in "offsetBlur", генерирует эффект освещения и сохраняет result в буфер "specOut".
Шаг 4
<feComposite in="specOut" in2="SourceAlpha" operator="in" result="specOut" />
Первый <feComposite> принимает in "specOut" и "SourceAlpha", маскирует результат "specOut", чтобы он не был больше "SourceAlpha" (исходного изображения), и перезаписывает result "specOut".
Шаг 5
<feComposite
in="SourceGraphic"
in2="specOut"
operator="arithmetic"
k1="0"
k2="1"
k3="1"
k4="0"
result="litPaint" />
Второй <feComposite> принимает in "SourceGraphic" и "specOut", добавляет результат "specOut" поверх "SourceGraphic" и сохраняет result в "litPaint".
Шаг 6
<feMerge> <feMergeNode in="offsetBlur" /> <feMergeNode in="litPaint" /> </feMerge>
Наконец, <feMerge> объединяет "offsetBlur", которое является тенью, и "litPaint", которое является исходным изображением с эффектом освещения.
Исходное изображение
Примитив 1
Примитив 2
Примитив 3
Примитив 4
Примитив 5
Примитив 6
© 2005–2024 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Filter_effects