滤镜效果模块 第一级

W3C工作草案,

此版本:
https://www.w3.org/TR/2018/WD-filter-effects-1-20181218/
最新发布版本:
https://www.w3.org/TR/filter-effects-1/
编辑草案:
https://drafts.fxtf.org/filter-effects-1/
以前版本:
测试套件:
http://test.csswg.org/suites/filter-effects/nightly-unstable/
问题跟踪:
内嵌于规范中
GitHub问题
编辑:
(Adobe公司)
(苹果公司)
前编辑:
Vincent Hardy
(受邀专家)
建议修改此规范:
GitHub 编辑器

摘要

滤镜效果是在元素显示于文档之前处理其渲染结果的方式。通常,使用CSS或SVG渲染元素可以概念化地描述为元素(包括其子元素)被绘制到一个缓冲区(如光栅图像)中,然后该缓冲区被组合到元素的父元素中。滤镜在组合阶段之前应用效果。例如此类效果包括模糊、改变颜色强度和扭曲图像。

虽然最初设计用于SVG,滤镜效果是一组可以应用于图像缓冲区的操作,因此几乎可以应用于任何展示环境,包括CSS。它们由样式指令触发(filter属性)。本规范描述了滤镜的使用方式,使其可以应用于使用CSS样式的内容,如HTML和SVG。它还定义了一个CSS属性值函数,该函数生成CSS <image>值。

CSS 是一种用于描述结构化文档(如HTML和XML)在屏幕、纸张等上的渲染的语言。

本文档的状态

本节描述了本文档在发布时的状态。其他文档可能会取代本文档。W3C发布的文档列表及本技术报告的最新修订版可以在https://www.w3.org/TR/中找到。

作为工作草案发布不意味着W3C会员的认可。这是一份草案文件,可能会随时更新、替换或废弃。引用本文件应以“进行中的工作”形式引用。

GitHub问题是讨论本规范的首选方式。 提交问题时,请在标题中添加文本“filter-effects”,最好这样写: “[filter-effects] …评论摘要…”。 所有问题和评论都会存档,还有一个历史存档

本文件由CSS工作组(属于样式活动的一部分)制作。

本文件由遵循W3C专利政策的工作组制作。 W3C维护了与工作组交付成果相关的专利披露公示列表,该页面还包括披露专利的说明。个人如有关于专利的实际知识,并认为其中包含必要专利权要求,必须根据W3C专利政策第6节披露信息。

本文档受2018年2月1日W3C流程文件管辖。

1. 简介

本节不具有规范性

滤镜效果是应用于元素的图形操作,当元素被绘制到文档中时起作用。它是一种基于图像的效果,输入可以是零个或多个图像,效果的特定参数,然后产生一个图像作为输出。输出的图像可以渲染到文档中替代原始元素,作为另一个滤镜效果的输入图像,或作为CSS图像值提供。

一个简单的滤镜效果示例是“填充色”,它不需要任何图像输入,但有一个定义颜色的参数。效果产生一个完全填充指定颜色的输出图像。一个稍微复杂的示例是“反转”,它需要一个图像输入(通常是元素按正常方式渲染到父级的图像),并调整每个像素,使其具有相反的颜色值。

滤镜效果以两种复杂度的层级暴露出来:

  1. 一组简单的预设滤镜函数,通过名称调用。虽然不够强大,但这些函数方便易懂,提供了一种简单的方法来实现常见效果,如模糊。预设滤镜也可以通过[CSS3-ANIMATIONS]进行动画化。

  2. 通过标记描述的各个滤镜效果的图,定义了整体效果。该图对其输入不具有依赖性,因此效果可以应用于任何内容。虽然这些图是由可能单独简单的效果组合而成,但整个图可以产生复杂的效果。下面给出了一个示例。

在此示例中,图像应用了<grayscale()>滤镜函数。
#image {
    filter: grayscale(100%);
}
应用了100%灰度滤镜的图像示例

没有滤镜的图像(左)和应用了100%灰度滤镜的相同图像(右)。

下面展示了一个由各个滤镜效果组成的图示例。
滤镜示例

一个被过滤的对象的初始示例。

查看此示例的SVG格式

上面示例中使用的滤镜效果在此重复,左列显示每个滤镜原语的参考编号:



1
2
3




4
5

6


<filter id="MyFilter" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="120">
  <desc>产生一个3D光照效果。</desc>
  <feGaussianBlur in="SourceAlpha" stdDeviation="4" result="blur"/>
  <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
  <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"/>
  <feMerge>
    <feMergeNode in="offsetBlur"/>
    <feMergeNode in="litPaint"/>
  </feMerge>
</filter>

下图显示了来自六个滤镜元素的中间图像结果:

filters01 - 原始源图形

源图形

filters01 - 滤镜元素1后的图像

滤镜原语1后

filters01 - 滤镜元素2后的图像

滤镜原语2后

filters01 - 滤镜元素3后的图像

滤镜原语3后

filters01 - 滤镜元素4后的图像

滤镜原语4后

filters01 - 滤镜元素5后的图像

滤镜原语5后

filters01 - 滤镜元素6后的图像

滤镜原语6后

  1. 滤镜原语feGaussianBlur接收输入SourceAlpha,即源图形的alpha通道。结果存储在一个名为“blur”的临时缓冲区中。请注意,“blur”作为输入同时用于滤镜原语2和3。

  2. 滤镜原语feOffset接收缓冲区“blur”,在x和y方向上将结果向正方向移动,并创建一个新缓冲区“offsetBlur”。效果是生成一个阴影。

  3. 滤镜原语feSpecularLighting使用缓冲区“blur”作为表面高度模型,并生成来自单点光源的光照效果。结果存储在缓冲区“specOut”中。

  4. 滤镜原语feComposite通过源图形的原始alpha通道屏蔽滤镜原语3的结果,使中间结果不超过原始源图形的尺寸。

  5. 滤镜原语feComposite将高光效果与原始源图形合成。

  6. 滤镜原语feMerge将两层合成在一起。下层由滤镜原语2的阴影结果组成,上层由滤镜原语5的高光效果结果组成。

2. 模块交互

本规范定义了一组影响应用这些属性的元素的视觉渲染的CSS属性;这些效果是在根据视觉格式模型对元素进行大小调整和定位之后应用的,出自[CSS21]。这些属性的某些值会导致创建包含块,和/或创建堆叠上下文

合成模型遵循SVG的合成模型[SVG11]:首先应用任何滤镜效果,然后是任何剪裁、遮罩和透明度[CSS3COLOR]。这些效果均在其他CSS效果(如边框)之后应用[CSS3BG]

本规范中的某些属性和元素定义需要SVG 1.1的实现[SVG11]。不支持SVG的UA不得实现color-interpolation-filtersflood-colorflood-opacitylighting-color属性,以及filter 元素,feMergeNode元素,传递函数元素 以及滤镜原语元素。

3.

本规范遵循CSS属性定义惯例出自[CSS21]。这些规范中未定义的值类型定义在CSS值与单位模块第3级[CSS3VAL]中。

除了其定义中列出的特定属性值之外,本规范中定义的所有属性还接受inherit关键字作为其属性值。为了可读性,未显式重复。

4. 术语

在本规范中使用时,术语具有本节中指定的含义。

滤镜原语, filter-primitive

控制滤镜元素输出的元素集合,特别是:feSpotLightfeBlendfeColorMatrixfeComponentTransferfeCompositefeConvolveMatrixfeDiffuseLightingfeDisplacementMapfeDropShadowfeFloodfeGaussianBlurfeImagefeMergefeMorphologyfeOffsetfeSpecularLightingfeTilefeTurbulence

透传滤镜

透传滤镜的输出等于滤镜原语的主输入。

5. 图形滤镜:filter 属性

filter属性的描述如下:

名称: filter
值: none | <filter-value-list>
初始值: none
适用于: 所有元素。在SVG中,适用于容器元素(不包括defs元素),所有图形元素use元素。
继承: no
百分比: 不适用
计算值: 按规定
语法顺序: 按语法顺序
媒体: 视觉
可动画: 滤镜动画中的详细描述。
<filter-value-list> = [ <filter-function> | <url> ]+
<url>

指向filter元素的滤镜引用。例如:url(commonfilters.svg#filter)。如果滤镜引用的对象不存在或引用的对象不是filter元素,则整个滤镜链被忽略。不会对对象应用任何滤镜。

<filter-function>

滤镜函数

none

未应用任何滤镜效果。

filter属性指定的值非none时,会为绝对定位和固定定位的后代创建包含块,除非应用此属性的元素是当前浏览上下文中的文档根元素。函数列表按提供的顺序应用。

列表中的第一个滤镜函数或filter引用将元素(SourceGraphic)作为输入图像。后续操作将上一个滤镜函数或filter引用的输出作为输入图像。filter元素引用函数可以指定替代输入,但仍然使用上一个输出作为其SourceGraphic

color-interpolation-filters对滤镜函数没有影响。滤镜函数必须在sRGB颜色空间中运行。

计算值非none时,会创建一个堆叠上下文,类似于CSS中的opacity。所有的元素后代将作为一个整体一起渲染,滤镜效果应用于整个组。

filter属性不会影响目标元素CSS框的几何形状,尽管filter可能会导致在元素的边框框之外进行绘制。

从概念上讲,任何部分的绘制都会受到滤镜操作的影响。这包括应用滤镜的元素的任何内容、背景、边框、文本装饰、轮廓和可见的滚动机制及其后代的这些部分。滤镜操作在元素的本地坐标系中应用。

合成模型遵循SVG合成模型[SVG11]:首先应用滤镜效果,然后是任何剪裁、遮罩和透明度。与SVG一样,应用filter对命中测试没有影响。

filter属性是SVG元素的展示属性

滤镜如何在固定背景图像上表现? <https://github.com/w3c/csswg-drafts/issues/238>

6. 滤镜函数

6.1. 支持的滤镜函数

<filter-function> = <blur()> | <brightness()> | <contrast()> | <drop-shadow()> |    
<grayscale()> | <hue-rotate()> | <invert()> | <opacity()> | <sepia()> | <saturate()>

除非另有定义,否则省略的值默认使用用于插值的初始值

注意:对于某些滤镜函数,省略值的默认值与其初始值不同。为了方便内容创建者,<grayscale()><sepia()><invert()>的默认值为1(应用100%的效果),而插值的初始值0(无效果)。

blur() = blur( <length>? )

对输入图像应用高斯模糊。传递的参数定义高斯函数的标准偏差值。该参数以CSS长度指定,但不接受百分比值。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为0px

插值的初始值0px

注意:标准偏差不同于box-shadow的模糊半径。

brightness() = brightness( <number-percentage>? )

对输入图像应用线性乘数,使其看起来更亮或更暗。0%的值将创建一个完全黑色的图像。100%的值不更改输入。其他值是效果的线性乘数。允许超过100%的值,产生更亮的结果。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值1

contrast() = contrast( <number-percentage>? )

调整输入图像的对比度。0%的值将创建一个完全灰色的图像。100%的值不更改输入。允许超过100%的值,产生更高对比度的结果。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值1

drop-shadow() = drop-shadow( <color>? && <length>{2,3} )

对输入图像应用阴影效果。投影阴影实际上是输入图像的alpha通道的模糊、偏移版本,以特定颜色绘制,组合在图像下方。值的解释方式类似于box-shadow[CSS3BG],但可选的第3个<length> 值是标准偏差,而不是模糊半径。该函数的标记等效项在下文中给出

省略值的默认值为缺失长度值设置为0,缺失使用的颜色来自color属性。

插值的初始值为所有长度值设置为0,使用的颜色设置为透明

注意:不接受扩展值或多重阴影作为本规范的这一层级。

注意:标准偏差不同于box-shadow的模糊半径。

grayscale() = grayscale( <number-percentage>? )

将输入图像转换为灰度。传递的参数定义转换比例。100%的值表示完全灰度化,0%的值不更改输入。0%100%之间的值是效果的线性乘数。允许超过100%的值,但UA必须将值限制为1。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值0

hue-rotate() = hue-rotate( [ <angle> | <zero> ]? )

对输入图像应用色调旋转。传递的参数定义颜色圆周围调整输入样本的度数。0deg的值不更改输入。实现不得规范化此值,以允许超过360deg的动画。该函数的标记等效项在下文中给出

如果<angle>为零,则可以省略单位标识符。

省略时的默认值为0deg

插值的初始值0deg

invert() = invert( <number-percentage>? )

对输入图像的样本进行反转。传递的参数定义转换比例。100%的值表示完全反转。0%的值不更改输入。0%100%之间的值是效果的线性乘数。允许超过100%的值,但UA必须将值限制为1。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值0

opacity() = opacity( <number-percentage>? )

对输入图像的样本应用透明度。传递的参数定义转换比例。0%的值表示完全透明。100%的值不更改输入。0%100%之间的值是效果的线性乘数。这等同于将输入图像样本乘以比例值。允许超过100%的值,但UA必须将值限制为1。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值1

注意:opacity滤镜函数并不是opacity属性的简写形式。此外,它允许在传递给下一个滤镜之前设置中间滤镜原语结果的透明度。如果最后一个滤镜原语设置为opacity滤镜函数,则opacity属性的值会乘以滤镜函数的值,这可能导致内容更加透明。

saturate() = saturate( <number-percentage>? )

对输入图像进行饱和处理。传递的参数定义转换比例。0%的值表示完全去饱和,100%的值不更改输入。其他值是效果的线性乘数。允许超过100%的值,产生超饱和的结果。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值1

sepia() = sepia( <number-percentage>? )

将输入图像转换为褐色。传递的参数定义转换比例。100%的值表示完全褐色化,0%的值不更改输入。0%100%之间的值是效果的线性乘数。允许超过100%的值,但UA必须将值限制为1。该函数的标记等效项在下文中给出

不允许负值。

省略时的默认值为1

插值的初始值0

6.2. 滤镜函数的计算值

<filter-function> 中的值按指定计算,但有以下例外情况:

6.3. 滤镜函数的序列化

要序列化 <filter-function>,请按其各自的语法顺序序列化,避免使用 <calc()> 表达式,并按指定序列化滤镜参数,避免 <calc()> 转换,用单个空格连接空格分隔的标记,并在每个序列化的逗号后加一个空格。

6.4. 滤镜函数的插值

对于 <filter-function> 中值的插值,必须执行以下列表中的第一个匹配条件对应的步骤:

<blur()>

按计算值插值长度值

<brightness()>
<contrast()>
<grayscale()>
<invert()>
<opacity()>
<saturate()>
<sepia()>

将百分比值转换为数字,0%相对于0,100%相对于1。按计算值插值数值

<hue-rotate()>

按计算值插值数值

<drop-shadow()>

可重复列表 插值阴影列表。

7. SVG 滤镜源: filter 元素

名称: filter
类别: 无.
内容模型: 可按任意顺序包含任意数量的以下元素:
属性:
DOM 接口: SVGFilterElement

filter 元素的描述如下:

<number-optional-number> = <number> <number>?

属性定义:

filterUnits = "userSpaceOnUse | objectBoundingBox"

参见 滤镜区域.

primitiveUnits = "userSpaceOnUse | objectBoundingBox"

指定了 滤镜原语 中的各种长度值和定义 滤镜原语子区域 的属性的坐标系。

如果 primitiveUnits 等于 userSpaceOnUse,则任何滤镜定义中的长度值表示的是应用 filter 元素时的当前 局部坐标系统 中的值(即引用 filter 元素的元素的用户坐标系统)。

如果 primitiveUnits 等于 objectBoundingBox,那么任何滤镜定义中的长度值表示的是引用元素边界框的分数或百分比(参见 对象边界框单位)。注意,如果 <number-optional-number> 值中只指定了一个数字,那么在计算 primitiveUnits 之前,此数字会被扩展。

primitiveUnits 的初始值是 userSpaceOnUse

可动画: 是。

x = "<length-percentage>"

参见 滤镜区域.

y = "<length-percentage>"

参见 滤镜区域.

width = "<length-percentage>"

参见 滤镜区域.

height = "<length-percentage>"

参见 滤镜区域.

filterRes = "<number-optional-number>"

filterRes 属性已从规范中删除。参见 SVG 1.1 规范 [SVG11]

属性从元素的祖先继承到 filter 元素; 属性不会从引用 filter 元素的元素继承。

filter 元素永远不会被直接渲染;它们仅作为可以通过 filter 属性引用的对象使用。 display 属性不适用于 filter 元素; 因此,即使 display 属性设置为除 none 以外的值,filter 元素也不会直接渲染,即使 display 属性在 filter 元素或其任何祖先上设置为 none

8. 滤镜区域

filter 元素可以在画布上定义一个滤镜区域,滤镜效果将应用于该区域,并为任何基于光栅的 滤镜原语 提供分辨率。在 filter 元素中,有以下属性共同定义了滤镜区域:

filterUnits

定义了 xywidthheight 属性的坐标系统。

如果 filterUnits 等于 userSpaceOnUse,那么 xywidthheight 表示在引用 filter 元素时用户坐标系中的值(即引用 filter 元素的元素的用户坐标系)。

如果 filterUnits 等于 objectBoundingBox,那么 xywidthheight 表示引用元素边界框的分数或百分比 (参见 对象边界框单位)。

filterUnits 的初始值是 objectBoundingBox

可动画: 是。

x, y, width, height

这些属性在画布上定义了该滤镜应用的矩形区域。

这些属性的坐标系统取决于 filterUnits 属性的值。

此矩形的边界充当了每个 滤镜原语 的硬剪裁区域;因此,如果给定滤镜原语的效果超出了矩形的边界(这在使用非常大的 feGaussianBlur 滤镜原语时会发生),部分效果将被剪裁。

xy 的初始值为 -10%

widthheight 的初始值为 120%

ng of the element which referenced the filter.

可动画: 是。

注意: filterUnits 的两种可能值 (即 objectBoundingBoxuserSpaceOnUse) 均会生成一个其坐标系统的 X 轴和 Y 轴分别平行于将应用滤镜的元素的 局部坐标系统 的滤镜区域。

注意: 有时,当滤镜区域可以直接映射到设备像素时,实施者可以实现更快的性能;因此,为了在显示设备上获得最佳性能,建议作者定义其区域,使用户代理可以像素对像素地将 滤镜区域 与背景对齐。特别是,为了获得最佳滤镜效果性能,请避免旋转或倾斜用户坐标系。

注意: 由于滤镜效果可能会影响对象边界框紧密配合之外的位,因此通常需要提供填充空间。出于这些目的,可以为 xy 提供负百分比值,并为 widthheight 提供大于 100% 的百分比值。例如,这就是滤镜区域默认值为 x="-10%" y="-10%" width="120%" height="120%" 的原因。

9. 滤镜原语

9.1. 概述

本节介绍了可组合以实现特定滤镜效果的各种滤镜原语。

除非另有说明,所有图像滤镜均对预乘的 RGBA 样本进行操作。一些滤镜如 feColorMatrixfeComponentTransfer 在非预乘数据上操作更加自然。在滤镜操作期间,所有颜色值必须暂时转换为当前滤镜所需的颜色乘法。

注意: 假定所有输入图像均为预乘的 RGBA。用户代理可以通过使用非预乘的数据缓冲来优化性能。

所有栅格效果滤镜操作需要 1 到 N 个输入 RGBA 图像,以及作为参数的其他属性,最终生成一个输出 RGBA 图像。

每个滤镜原语的 RGBA 结果将被限制在颜色和不透明度值的允许范围内。因此,例如,给定的 滤镜原语 的结果中的任何负颜色值或不透明度值将被调整为颜色/不透明度为零。

某个特定的 滤镜原语 执行其操作的颜色空间由给定元素上的 color-interpolation-filters 属性的值决定。另一个属性 color-interpolation 决定了其他颜色操作的颜色空间。由于这两个属性的初始值不同(color-interpolation-filters 的初始值为 linearRGB,而 color-interpolation 的初始值为 sRGB),因此在某些情况下,为了实现特定效果(例如,在协调渐变插值与滤镜操作时),需要显式地将 color-interpolation 设置为 linearRGB 或将 color-interpolation-filters 设置为 sRGB。请注意,下面的示例未明确设置 color-interpolationcolor-interpolation-filters,因此这些示例适用这些属性的初始值。

有时 滤镜原语 会产生未定义的像素。例如,滤镜原语 feOffset 可以将图像向下和向右移动,导致顶部和左侧出现未定义的像素。在这些情况下,未定义的像素将设置为透明黑色。

为了提供高质量的渲染,所有滤镜原语应在设备相关的坐标空间中操作,即 操作坐标空间,并考虑到设备像素密度、用户空间变换和缩放。为了提供平台独立的对齐方式,属性和属性值通常是相对于 primitiveUnits 属性描述的坐标系统的。用户代理必须将这些相对属性和属性值缩放到 操作坐标空间

注意: 在高分辨率设备上,primitiveUnits 相对的属性和属性值通常需要放大。用户代理可以在有限的平台资源上降低滤镜原语的分辨率。

注意: 滤镜原语 feConvolveMatrix光源 的某些属性或属性值无法从 primitiveUnits 属性定义的坐标空间映射到 操作坐标空间

9.2. 常用滤镜原语属性

以下 滤镜原语属性 适用于所有滤镜原语:

属性定义:

x = "<length-percentage>"

用于限制计算和渲染给定 滤镜原语 的子区域的最小 x 坐标。参见 滤镜原语子区域

初始值0%

可动画: 是。

y = "<length-percentage>"

用于限制计算和渲染给定 滤镜原语 的子区域的最小 y 坐标。参见 滤镜原语子区域

初始值0%

可动画: 是。

width = "<length-percentage>"

用于限制计算和渲染给定 滤镜原语 的子区域的宽度。参见 滤镜原语子区域

负值或零值将禁用给定滤镜原语的效果(即结果为透明的黑色图像)。

初始值100%

可动画: 是。

height = "<length-percentage>"

用于限制计算和渲染给定 滤镜原语 的子区域的高度。参见 滤镜原语子区域

负值或零值必须禁用给定滤镜原语的效果(即结果为透明的黑色图像)。

初始值100%

可动画: 是。

result = "<filter-primitive-reference>"

<filter-primitive-reference> 是一个 <custom-ident> [CSS3VAL],是此 滤镜原语 的指定名称。如果提供了值,则通过处理此 滤镜原语 生成的图形可以通过同一 in 属性在后续滤镜原语中引用。如果未提供值,则输出将仅可作为下一个 滤镜原语 的隐式输入使用,前提是该 滤镜原语 未为其 in 属性提供值。

大多数滤镜原语使用其他滤镜原语作为输入。以下属性代表所有输入属性,用于引用其他滤镜原语:

属性定义:

in = "SourceGraphic | SourceAlpha | BackgroundImage | BackgroundAlpha | FillPaint | StrokePaint | <filter-primitive-reference>"

指定给定滤镜原语的输入。该值可以是六个关键字之一,也可以是一个字符串,该字符串与同一 result 属性的值相匹配。如果未提供值,并且这是第一个 滤镜原语,则此 滤镜原语 将使用 SourceGraphic 作为其输入。如果未提供值,并且这是后续的 滤镜原语, 则此 滤镜原语 将使用先前 滤镜原语 的结果作为其输入。

如果 result 的值在给定的 滤镜 元素中出现多次,则对该结果的引用将使用前面最近的具有相应 result 属性值的 滤镜原语

不允许对结果的前向引用,并且会被视为未指定任何结果。

对不存在结果的引用将被视为未指定任何结果。

六个关键字的定义如下:

SourceGraphic

此关键字表示原始输入到 滤镜 元素的图形元素。对于栅格效果 滤镜原语,图形元素将被光栅化为图像空间中的初始透明 RGBA 栅格。原始图形未触及的像素将保持透明。图像被指定为在线性 RGBA 像素中渲染。该图像的 alpha 通道捕捉到由 SVG 指定的任何抗锯齿效果。(由于栅格是线性的,因此该图像的 alpha 通道将表示每个像素的精确覆盖百分比。)

SourceAlpha

此关键字表示原始输入到 滤镜 元素的图形元素。SourceAlphaSourceGraphic 的所有规则相同,但仅使用 alpha 通道。输入图像是一个 RGBA 图像,其 RGB 通道为隐式黑色,但其 alpha 通道与 SourceGraphic 相同。

注意: 如果使用此选项,则某些实现可能需要光栅化图形元素以提取 alpha 通道。

BackgroundImage

此关键字表示当前隔离组在调用 滤镜 元素时定义的滤镜区域背后的背景。参见 isolation 属性 [COMPOSITING-1]

BackgroundAlpha

BackgroundImage 相同,但仅使用 alpha 通道。参见 SourceAlphaisolation 属性 [COMPOSITING-1]

FillPaint

此关键字表示目标元素上 fill 属性的值。FillPaint 图像的概念上是无限的。通常此图像在各处都不透明,但如果“油漆”本身具有 alpha,则可能不是这种情况,例如在渐变或图案本身包含透明或半透明部分的情况下。如果 fill 引用了一个油漆服务器,则油漆服务器的坐标空间由过滤对象定义。例如,如果油漆服务器需要使用对象的 objectBoundingBox,则过滤对象的对象边界框定义了油漆服务器的参考大小。如果油漆服务器需要使用 userSpaceOnUse,则滤镜对象的 本地坐标系统 中最近的视口定义了油漆服务器的参考大小。

StrokePaint

此关键字表示目标元素上 stroke 属性的值。StrokePaint 图像的概念上是无限的。参见上文 FillPaint 了解更多细节。

可动画: 是。

9.3. 滤镜原语树

没有或只有一个滤镜原语输入的滤镜原语可以链接在一起,形成一个滤镜链。例如,表示一个包含两个或更多 <filter-value-list> 的滤镜原语,是滤镜链的一个例子。每个滤镜原语都将前一个滤镜原语的结果作为输入。

一个简单的 filter 元素及其子滤镜原语的例子。
<filter id="filter">
  <feColorMatrix type="hueRotate" values="45"/>
  <feOffset dx="10" dy="10"/>
  <feGaussianBlur stdDeviation="3"/>
</filter>

feColorMatrixfeOffsetfeGaussianBlur 组成了一个滤镜链。

feColorMatrixSourceGraphic 作为输入。结果作为 feOffset 的输入,随后其结果作为 feGaussianBlur 的输入。

某些滤镜原语可能有多个滤镜原语输入。通过使用 inresult 属性,可以将多个滤镜原语组合成一个复杂的滤镜结构。由于滤镜原语的非前向引用限制,每个滤镜结构都可以表示为一棵树,即 滤镜原语树。滤镜原语树的根滤镜原语是 filter 元素的子滤镜原语中最末的原语。

滤镜链是可以表示为滤镜原语树的一种滤镜结构。因此,滤镜链也称为滤镜原语树。

一个 filter 元素可以有一个或多个滤镜原语树。最后一个滤镜原语是 filter 元素的子滤镜原语的滤镜原语树是 主要滤镜原语树

只有主要滤镜原语树参与滤镜处理。实现可能会选择忽略所有其他可能的滤镜原语树。

如果 filter 元素没有滤镜原语树,则该滤镜应用的元素将不会被渲染。

一个包含多个滤镜原语树的例子:
<filter id="filter">
  <--  一个 滤镜原语树 滤镜处理 忽略-->
  <feColorMatrix type="hueRotate" values="45"/>
  <feOffset dx="10" dy="10"/>
  <feGaussianBlur stdDeviation="3"/>
  <-- 主要 滤镜原语树-->
  <feFlood flood-color="green" result="flood"/>
  <feComposite operator="in" in="SourceAlpha" in2="flood"/>
</filter>

上面的滤镜包含两个滤镜原语树,其滤镜原语为:

  1. feColorMatrixfeOffsetfeGaussianBlurfeGaussianBlur 为该树的根滤镜原语)以及

  2. feFloodfeCompositefeComposite 为该树的根滤镜原语)。

这两个滤镜原语树之间没有连接。只有第二个,即主要滤镜原语树参与了滤镜处理。第一个树可以被实现忽略。

9.4. 滤镜原语子区域

所有 滤镜原语 都具有 xywidthheight 属性,它们共同定义了 滤镜原语子区域,该区域限制了给定的 滤镜原语 的计算和渲染。xywidthheight 属性根据与其他 滤镜原语 坐标和长度属性相同的规则定义,因此代表由 primitiveUnits 属性在 filter 元素上建立的坐标系中的值。

xywidthheight 默认为所有引用节点的子区域的联合(即最紧密适合的边界框)。如果没有引用节点(例如 feImagefeTurbulence),或者一个或多个引用节点是标准输入(其中之一是 SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint),或者对于 feTile(这是一个特殊情况,因为它的主要功能是将引用的节点在 X 和 Y 方向上复制,从而产生通常更大的结果),默认子区域为 0%, 0%, 100%, 100%,其中百分比是相对于 滤镜区域 的尺寸的,因此默认的 滤镜原语子区域 等于 滤镜区域

如果 滤镜原语子区域 的宽度或高度为负值或零,则滤镜原语的效果被禁用。

滤镜区域 作为一个硬性裁剪矩形作用于滤镜原语的输入图像。

滤镜原语子区域 作为一个硬性裁剪矩形作用于滤镜原语的结果。

所有的中间离屏都被定义为不超过 滤镜原语子区域滤镜区域 的交集。滤镜区域 和任何滤镜原语子区域应设置为足够大,以容纳任何与 滤镜区域 或滤镜原语子区域部分相交的像素。

feTile 引用了前一个滤镜原语,然后基于引用滤镜原语的 滤镜原语子区域 将图块拼接在一起,以填充其自身的 滤镜原语子区域
<svg width="400" height="400" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <filter id="flood" x="0" y="0" width="100%" height="100%" primitiveUnits="objectBoundingBox">
       <feFlood x="25%" y="25%" width="50%" height="50%"
          flood-color="green" flood-opacity="0.75"/>
    </filter>
    <filter id="blend" primitiveUnits="objectBoundingBox">
       <feBlend x="25%" y="25%" width="50%" height="50%"
          in2="SourceGraphic" mode="multiply"/>
    </filter>
    <filter id="merge" primitiveUnits="objectBoundingBox">
       <feMerge x="25%" y="25%" width="50%" height="50%">
        <feMergeNode in="SourceGraphic"/>
        <feMergeNode in="FillPaint"/>
       </feMerge>
    </filter>
  </defs>

  <g fill="none" stroke="blue" stroke-width="4">
     <rect width="200" height="200"/>
     <line x2="200" y2="200"/>
     <line x1="200" y2="200"/>
  </g>
  <circle fill="green" filter="url(#flood)" cx="100" cy="100" r="90"/>

  <g transform="translate(200 0)">
    <g fill="none" stroke="blue" stroke-width="4">
       <rect width="200" height="200"/>
       <line x2="200" y2="200"/>
       <line x1="200" y2="200"/>
    </g>
    <circle fill="green" filter="url(#blend)" cx="100" cy="100" r="90"/>
  </g>

  <g transform="translate(0 200)">
    <g fill="none" stroke="blue" stroke-width="4">
       <rect width="200" height="200"/>
       <line x2="200" y2="200"/>
       <line x1="200" y2="200"/>
    </g>
    <circle fill="green" fill-opacity="0.5" filter="url(#merge)" cx="100" cy="100" r="90"/>
  </g>
</svg>
子区域示例

子区域示例

查看此示例为 SVG

在上面的示例中,每个矩形都有一个十字和一个圆形元素。每个圆形元素应用了不同的滤镜,但都使用了相同的 滤镜原语子区域。滤镜输出应该仅限于 滤镜原语子区域,因此你应该看不到圆形本身,只能看到构成 滤镜原语子区域 的矩形。

9.5. 滤镜原语 feBlend

名称: feBlend
类别: 滤镜原语
内容模型: 任何数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEBlendElement

此滤镜使用常见的图像处理软件的混合模式将两个对象混合在一起。它执行两个输入图像的逐像素组合。(参见 [COMPOSITING-1]。)

属性定义:

mode = "<blend-mode>"

一种由“合成与混合 1 级”定义的混合模式,[COMPOSITING-1],其中输入 in 表示源 Cs,第二个输入 in2 表示 背景 Cb。此滤镜原语的输出 CmCsCb 混合的结果。

初始值normal

可动画:是。

no-composite = "no-composite"

如果存在 no-composite 属性,则指定的混合模式不应应用 alpha 合成。参见 混合 [COMPOSITING-1],了解无合成的“混合”公式。否则,必须将由 mode 指定的混合模式与 源覆盖 合成操作符相结合。参见 混合 [COMPOSITING-1],了解带合成的“混合”公式。

注意: 此属性是对 SVG 1.1 中 feBlend 元素定义的补充。当指定 no-composite 时,旨在避免在使用 BackgroundImage 滤镜原语时混合输入源与被滤对象的背景时出现“双重合成”效果。对于大多数使用情况,作者不需要指定 no-composite 属性。

可动画:否。

in2 = "参见 in 属性"

混合操作的第二个输入图像。

可动画:是。

normal 混合模式与 alpha 合成相当于 feComposite 滤镜原语上的 operator="over",与 feMerge 的混合方式匹配,也与 SVG 中所有滤镜效果外的合成使用的 简单 alpha 合成 技术相匹配。

<svg width="5cm" height="5cm" viewBox="0 0 500 500"
 xmlns="http://www.w3.org/2000/svg"> 
<title>示例 feBlend - feBlend 模式示例</title> 
<desc>五个文本字符串与渐变混合,每个文本字符串对应一个 feBlend 模式。</desc> 
<defs> 
 <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse" 
 x1="100" y1="0" x2="300" y2="0"> 
 <stop offset="0" stop-color="#000000"/> 
 <stop offset=".33" stop-color="#ffffff"/> 
 <stop offset=".67" stop-color="#ff0000"/> 
 <stop offset="1" stop-color="#808080"/> 
 </linearGradient> 
 <filter id="Normal"> 
 <feBlend mode="normal" in2="BackgroundImage" in="SourceGraphic"/> 
 </filter> 
 <filter id="Multiply"> 
 <feBlend mode="multiply" in2="BackgroundImage" in="SourceGraphic"/> 
 </filter> 
 <filter id="Screen"> 
 <feBlend mode="screen" in2="BackgroundImage" in="SourceGraphic"/> 
 </filter> 
 <filter id="Darken"> 
 <feBlend mode="darken" in2="BackgroundImage" in="SourceGraphic"/> 
 </filter> 
 <filter id="Lighten"> 
 <feBlend mode="lighten" in2="BackgroundImage" in="SourceGraphic"/> 
 </filter> 
</defs> 
<rect fill="none" stroke="blue" 
 x="1" y="1" width="498" height="498"/> 
<g isolation="isolate" > 
 <rect x="100" y="20" width="300" height="460" fill="url(#MyGradient)"/> 
 <g font-family="Verdana" font-size="75" fill="#888888" fill-opacity=".6"> 
 <text x="50" y="90" filter="url(#Normal)">Normal</text> 
 <text x="50" y="180" filter="url(#Multiply)">Multiply</text> 
 <text x="50" y="270" filter="url(#Screen)">Screen</text> 
 <text x="50" y="360" filter="url(#Darken)">Darken</text> 
 </text> 
 </g> 
 </g> 
</svg>
feBlend 示例

feBlend 示例

查看此示例为 SVG

9.6. 滤镜原语 feColorMatrix

名称: feColorMatrix
类别: 滤镜原语
内容模型: 任意数量的 描述元素, animate, script, set 元素,顺序不限。
属性:
DOM 接口: SVGFEColorMatrixElement

此滤镜应用了矩阵转换:

R ' G ' B ' A ' 1 = a 00 a 01 a 02 a 03 a 04 a 10 a 11 a 12 a 13 a 14 a 20 a 21 a 22 a 23 a 24 a 30 a 31 a 32 a 33 a 34 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { a_00 # a_01 # a_02 # a_03 # a_04 ## a_10 # a_11 # a_12 # a_13 # a_14 ## a_20 # a_21 # a_22 # a_23 # a_24 ## a_30 # a_31 # a_32 # a_33 # a_34 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

对输入图形的每个像素的 RGBA 颜色和 alpha 值进行矩阵转换,生成具有新 RGBA 颜色和 alpha 值的结果。

计算是在非预乘的颜色值上进行的。

属性定义:

type = "matrix | saturate | hueRotate | luminanceToAlpha"

指示矩阵操作的类型。关键字 matrix 表示将提供完整的 5x4 矩阵值。其他关键字代表便捷的快捷方式,允许在不指定完整矩阵的情况下执行常用的颜色操作。

初始值typematrix

可动画: 是。

values = "list of <number>s"

values 的内容取决于属性 type 的值:

  • 对于 type="matrix"values 是一个包含 20 个矩阵值的列表(a00 a01 a02 a03 a04 a10 a11 ... a34),由空格和/或逗号分隔。例如,单位矩阵可以表示为:

    type="matrix"
    values="1 0 0 0 0  0 1 0 0 0  0 0 1 0 0  0 0 0 1 0"
  • 对于 type="saturate"values 是一个单一的实数值。saturate 操作等同于以下矩阵操作:

    R ' G ' B ' A ' 1 = 0.213 + 0.787s 0.715 0.715s 0.072 0.072s 0 0 0.213 0.213s 0.715 + 0.285s 0.072 0.072s 0 0 0.213 0.213s 0.715 0.715s 0.072 + 0.928s 0 0 0 0 0 1 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { 0.213 + 0.787s # 0.715 - 0.715s # 0.072 - 0.072s # 0 # 0 ## 0.213 - 0.213s # 0.715 + 0.285s # 0.072 - 0.072s # 0 # 0 ## 0.213 - 0.213s # 0.715 - 0.715s # 0.072 + 0.928s # 0 # 0 ## 0 # 0 # 0 # 1 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

    注意: 一个值为 0 的情况下,生成的滤镜效果将完全去饱和(灰度化),而一个值为 1 则让滤镜输入图像不做任何更改地通过。超出 0..1 范围的值会分别导致滤镜输入图像的欠饱和或过饱和。

    注意: 与以前的规范文本相比,亮度系数的精度有所提高 [Cmam]

  • 对于 type="hueRotate"values 是一个单一的实数值(以度数表示)。hueRotate 操作等同于以下矩阵操作:

    R ' G ' B ' A ' 1 = a 00 a 01 a 02 0 0 a 10 a 11 a 12 0 0 a 20 a 21 a 22 0 0 0 0 0 1 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { a_00 # a_01 # a_02 # 0 # 0 ## a_10 # a_11 # a_12 # 0 # 0 ## a_20 # a_21 # a_22 # 0 # 0 ## 0 # 0 # 0 # 1 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

    其中 a00, a01 等项的计算方式如下:

    a 00 a 01 a 02 a 10 a 11 a 12 a 20 a 21 a 22 = + 0.213 + 0.715 + 0.072 + 0.213 + 0.715 + 0.072 + 0.213 + 0.715 + 0.072 + cos ( hueRotate value ) + 0.787 0.715 0.072 0.213 + 0.285 0.072 0.213 0.715 + 0.928 + sin ( hueRotate value ) 0.213 0.715 + 0.928 + 0.143 + 0.140 0.283 0.787 + 0.715 + 0.072 left[ matrix { a_00 # a_01 # a_02 ## a_10 # a_11 # a_12 ## a_20 # a_21 # a_22 } right] = left[ matrix { +0.213 # +0.715 # +0.072 ## +0.213 # +0.715 # +0.072 ## +0.213 # +0.715 # +0.072 } right] + cos(hueRotate value)cdot left[ matrix { +0.787 # -0.715 # -0.072 ## -0.213 # +0.285 # -0.072 ## -0.213 # -0.715 # +0.928 } right] + sin(hueRotate value) cdot left[ matrix { -0.213 # -0.715 # +0.928 ## +0.143 # +0.140 # -0.283 ## -0.787 # +0.715 # +0.072 } right]

    因此,色相矩阵的左上角项为:

    a 00 = 0.2127 + cos ( hueRotate value ) 0.7873 sin ( hueRotate value ) 0.2127 a_00 = 0.2127 + cos(hueRotate value) cdot 0.7873 - sin(hueRotate value) cdot 0.2127
  • 对于 type="luminanceToAlpha"values 不适用。luminanceToAlpha 操作等同于以下矩阵操作:

    R ' G ' B ' A ' 1 = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2126 0.7152 0.0722 0 0 0 0 0 0 1 R G B A 1 left [ stack {R' # G' # B' # A' # 1} right ] = left [ matrix { 0 # 0 # 0 # 0 # 0 ## 0 # 0 # 0 # 0 # 0 ## 0 # 0 # 0 # 0 # 0 ## 0.2126 # 0.7152 # 0.0722 # 0 # 0 ## 0 # 0 # 0 # 0 # 1 } right ] cdot left[ stack { R # G # B # A # 1 } right]

初始值 对于values

如果 type="matrix"

默认为单位矩阵

如果 type="saturate"

默认为值 1

如果 type="hueRotate"

默认为值 0,结果是单位矩阵。

如果 values 列表中的条目数与 type 所需的条目数不匹配,滤镜原语将作为 透传滤镜 运行。

可动画: 是。

<svg width="8cm" height="5cm" viewBox="0 0 800 500"
     xmlns="http://www.w3.org/2000/svg">
  <title>示例 feColorMatrix - feColorMatrix 操作示例</title>
  <desc>五个文本字符串展示了 feColorMatrix 的效果:
        一个未过滤的文本字符串作为参考,
        使用 feColorMatrix 矩阵选项将其转换为灰度,
        使用 feColorMatrix 饱和选项,
        使用 feColorMatrix hueRotate 选项,
        以及使用 feColorMatrix luminanceToAlpha 选项。</desc>
  <defs>
    <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
            x1="100" y1="0" x2="500" y2="0">
      <stop offset="0" stop-color="#ff00ff" />
      <stop offset=".33" stop-color="#88ff88" />
      <stop offset=".67" stop-color="#2020ff" />
      <stop offset="1" stop-color="#d00000" />
    </linearGradient>
    <filter id="Matrix" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="matrix" in="SourceGraphic"
           values=".33 .33 .33 0 0
                   .33 .33 .33 0 0
                   .33 .33 .33 0 0
                   .33 .33 .33 0 0"/>
    </filter>
    <filter id="Saturate40" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="saturate" in="SourceGraphic" values="0.4"/>
    </filter>
    <filter id="HueRotate90" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="hueRotate" in="SourceGraphic" values="90"/>
    </filter>
    <filter id="LuminanceToAlpha" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="luminanceToAlpha" in="SourceGraphic" result="a"/>
      <feComposite in="SourceGraphic" in2="a" operator="in" />
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="798" height="498"/>
  <g font-family="Verdana" font-size="75"
            font-weight="bold" fill="url(#MyGradient)" >
    <rect x="100" y="0" width="500" height="20" />
    <text x="100" y="90">Unfiltered</text>
    <text x="100" y="190" filter="url(#Matrix)" >Matrix</text>
    <text x="100" y="290" filter="url(#Saturate40)" >Saturate</text>
    <text x="100" y="390" filter="url(#HueRotate90)" >HueRotate</text>
    <text x="100" y="490" filter="url(#LuminanceToAlpha)" >Luminance</text>
  </g>
</svg>
示例

feColorMatrix 示例

以 SVG 格式查看此示例

9.7. 滤镜原语 feComponentTransfer

名称: feComponentTransfer
分类: 滤镜原语
内容模型: 任意数量的 描述性元素, feFuncR, feFuncG, feFuncB, feFuncA, script 元素,顺序不限。
属性:
DOM 接口: SVGFEComponentTransferElement

该滤镜原语执行数据的分量重映射,如下所示:

R' = feFuncR( R )
G' = feFuncG( G )
B' = feFuncB( B )
A' = feFuncA( A )

每个像素都执行这种操作。它允许诸如亮度调整、对比度调整、色彩平衡或阈值处理等操作。

这些计算是在非预乘颜色值上进行的。

feComponentTransfer 元素的子元素指定了四个通道的传输函数:

一组 feFuncRfeFuncGfeFuncBfeFuncA 元素也被称为传输函数元素

以下规则适用于 feComponentTransfer 元素的处理:

9.7.1. 传输函数 feFuncR

名称: feFuncR
分类: 传输函数元素
内容模型: 可以包含任意数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEFuncRElement

以下属性是 传输函数元素属性,适用于传输函数元素

属性定义:

type = "identity | table | discrete | linear | gamma"

指示组件传输函数的类型。函数类型决定了其他属性的适用性。

下列情况下,C 是初始组件(例如,feFuncR),C' 是重新映射后的组件;两者均在 [0,1] 的闭合区间内。

  • 对于 identity:

    C' = C
  • 对于 table,函数由属性tableValues 中给出的值之间的线性插值定义。该表具有 n+1 个值(即 v0 到 vn),指定 n 个大小均匀的插值区域的起始值和结束值。插值使用以下公式:

    对于 C < 1 的值,找到 k 使得:

    k/n <= C < (k+1)/n

    结果 C' 为:

    C' = vk + (C - k/n)*n * (vk+1 - vk)

    如果 C = 1,则:

    C' = vn.

  • 对于 discrete,函数由属性 tableValues 给出的阶跃函数定义,提供 n 个值(即 v0 到 vn-1),以确定由 n 个阶跃组成的阶跃函数。阶跃函数通过以下公式定义:

    对于 C < 1 的值,找到 k 使得:

    k/n <= C < (k+1)/n

    结果 C' 为:

    C' = vk

    如果 C = 1,则:

    C' = vn-1.

  • 对于 linear,函数由以下线性方程定义:

    C' = slope * C + intercept

  • 对于 gamma,函数由以下指数函数定义:

    C' = amplitude * pow(C, exponent) + offset

属性 初始值typeidentity

可动画:是。

tableValues = "(<number> 列表)"

type="table" 时,列表 <number> s v0,v1,...vn,以空格和/或逗号分隔,定义查找表。空列表将导致标识传输函数。

如果未指定此属性,则效果就像提供了一个空列表。

可动画:是。

slope = "<number>"

type="linear" 时,线性函数的斜率。

属性 初始值slope1

可动画:是。

intercept = "<number>"

type="linear" 时,线性函数的截距。

属性 初始值intercept0

可动画:是。

amplitude = "<number>"

type="gamma" 时,伽玛函数的振幅。

属性 初始值amplitude1

可动画:是。

exponent = "<number>"

type="gamma" 时,伽玛函数的指数。

属性 初始值exponent1

可动画:是。

offset = "<number>"

type="gamma" 时,伽玛函数的偏移量。

属性 初始值offset0

可动画:是。

<svg width="8cm" height="4cm" viewBox="0 0 800 400"
     xmlns="http://www.w3.org/2000/svg">
  <title>feComponentTransfer 示例 - feComponentTransfer 操作的示例</title>
  <desc>四个文本字符串,显示 feComponentTransfer 的效果:
        一个作为参考的身份函数,
        使用 feComponentTransfer 表选项,
        使用 feComponentTransfer 线性选项,
        以及使用 feComponentTransfer 伽玛选项。</desc>
  <defs>
    <linearGradient id="MyGradient" gradientUnits="userSpaceOnUse"
            x1="100" y1="0" x2="600" y2="0">
      <stop offset="0" stop-color="#ff0000" />
      <stop offset=".33" stop-color="#00ff00" />
      <stop offset=".67" stop-color="#0000ff" />
      <stop offset="1" stop-color="#000000" />
    </linearGradient>
    <filter id="Identity" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="identity"/>
        <feFuncG type="identity"/>
        <feFuncB type="identity"/>
        <feFuncA type="identity"/>
      </feComponentTransfer>
    </filter>
    <filter id="Table" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="table" tableValues="0 0 1 1"/>
        <feFuncG type="table" tableValues="1 1 0 0"/>
        <feFuncB type="table" tableValues="0 1 1 0"/>
      </feComponentTransfer>
    </filter>
    <filter id="Linear" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="linear" slope=".5" intercept=".25"/>
        <feFuncG type="linear" slope=".5" intercept="0"/>
        <feFuncB type="linear" slope=".5" intercept=".5"/>
      </feComponentTransfer>
    </filter>
    <filter id="Gamma" filterUnits="objectBoundingBox"
            x="0%" y="0%" width="100%" height="100%">
      <feComponentTransfer>
        <feFuncR type="gamma" amplitude="2" exponent="5" offset="0"/>
        <feFuncG type="gamma" amplitude="2" exponent="3" offset="0"/>
        <feFuncB type="gamma" amplitude="2" exponent="1" offset="0"/>
      </feComponentTransfer>
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="798" height="398"/>
  <g font-family="Verdana" font-size="75"
            font-weight="bold" fill="url(#MyGradient)" >
    <rect x="100" y="0" width="600" height="20" />
    <text x="100" y="90">Identity</text>
    <text x="100" y="190" filter="url(#Table)" >TableLookup</text>
    <text x="100" y="290" filter="url(#Linear)" >LinearFunc</text>
    <text x="100" y="390" filter="url(#Gamma)" >GammaFunc</text>
  </g>
</svg>
feComponentTransfer 示例

feComponentTransfer 示例

查看此示例为 SVG

9.7.2. 传递函数 feFuncG

名称: feFuncG
类别: 传递函数元素
内容模型: 可包含任意数量的描述性元素animatescriptset 元素,以任意顺序排列。
属性:
DOM 接口: SVGFEFuncGElement

有关属性值的定义,请参见 feFuncR

9.7.3. 传递函数 feFuncB

名称: feFuncB
类别: 传递函数元素
内容模型: 可包含任意数量的描述性元素animatescriptset 元素,以任意顺序排列。
属性:
DOM 接口: SVGFEFuncBElement

有关属性值的定义,请参见 feFuncR

9.7.4. 传递函数 feFuncA

名称: feFuncA
类别: 传递函数元素
内容模型: 可包含任意数量的描述性元素animatescriptset 元素,以任意顺序排列。
属性:
DOM 接口: SVGFEFuncAElement

有关属性值的定义,请参见 feFuncR

9.8. 滤镜基元 feComposite

名称: feComposite
类别: 滤镜基元
内容模型: 可包含任意数量的描述性元素animatescriptset 元素,以任意顺序排列。
属性:
DOM 接口: SVGFECompositeElement

此滤镜通过图像空间中逐像素组合两个输入图像,使用其中之一的 Porter-Duff [PORTERDUFF] 合成操作: overinatopoutxorlighter [COMPOSITING-1]。另外,还可以应用逐分量的arithmetic(算术)操作(结果限制在 [0..1] 范围内)。

arithmetic操作在将feDiffuseLightingfeSpecularLighting滤镜与纹理数据结合时非常有用。同时,它对于实现dissolve(溶解)效果也很有帮助。如果选择了arithmetic操作,则每个结果像素通过以下公式计算:

result = k1*i1*i2 + k2*i1 + k3*i2 + k4

其中:

对于此滤镜基元,生成的图像范围可能会扩大,详见描述滤镜基元子区域的部分。

属性定义:

operator = "over | in | out | atop | xor | lighter | arithmetic"
要执行的合成操作。除arithmetic以外的所有operator类型都与[COMPOSITING-1]中描述的相应操作相匹配,in表示源,in2表示目标。arithmetic操作如上所述。
初始值over
可动画: 是。
k1 = "<number>"
仅在operator="arithmetic"时适用。
初始值0
可动画: 是。
k2 = "<number>"
仅在operator="arithmetic"时适用。
初始值0
可动画: 是。
k3 = "<number>"
仅在operator="arithmetic"时适用。
初始值0
可动画: 是。
k4 = "<number>"
仅在operator="arithmetic"时适用。
初始值0
可动画: 是。
in2 = "(参见in属性)"
进行合成操作的第二个输入图像。
可动画: 是。

注意: Compositing and Blending [COMPOSITING-1] 定义了更多的合成关键词。通过切换输入滤镜基元inin2,可以实现其他关键词的功能。

<svg width="330" height="195" viewBox="0 0 1100 650"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>Example feComposite - Examples of feComposite operations</title>
  <desc>Four rows of six pairs of overlapping triangles depicting
        the six different feComposite operators under different
        opacity values and different clearing of the background.</desc>
  <defs>
    <desc>Define two sets of six filters for each of the six compositing operators.
          The first set wipes out the background image by flooding with opaque white.
          The second set does not wipe out the background, with the result
          that the background sometimes shines through and is other cases
          is blended into itself (i.e., "double-counting").</desc>
    <filter id="overFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="over" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="inFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="in" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="outFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="out" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="atopFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="atop" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="xorFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="xor" result="comp"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="arithmeticFlood" filterUnits="objectBoundingBox"
            x="-5%" y="-5%" width="110%" height="110%">
      <feFlood flood-color="#ffffff" flood-opacity="1" result="flood"/>
      <feComposite in="SourceGraphic" in2="BackgroundImage" result="comp"
                   operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
      <feMerge> <feMergeNode in="flood"/> <feMergeNode in="comp"/> </feMerge>
    </filter>
    <filter id="overNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="over" result="comp"/>
    </filter>
    <filter id="inNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="in" result="comp"/>
    </filter>
    <filter id="outNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="out" result="comp"/>
    </filter>
    <filter id="atopNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="atop" result="comp"/>
    </filter>
    <filter id="xorNoFlood" filterUnits="objectBoundingBox" x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" operator="xor" result="comp"/>
    </filter>
    <filter id="arithmeticNoFlood" filterUnits="objectBoundingBox"
            x="-5%" y="-5%" width="110%" height="110%">
      <feComposite in="SourceGraphic" in2="BackgroundImage" result="comp"
                   operator="arithmetic" k1=".5" k2=".5" k3=".5" k4=".5"/>
    </filter>
    <path id="Blue100" d="M 0 0 L 100 0 L 100 100 z" fill="#00ffff" />
    <path id="Red100" d="M 0 0 L 0 100 L 100 0 z" fill="#ff00ff" />
    <path id="Blue50" d="M 0 125 L 100 125 L 100 225 z" fill="#00ffff" fill-opacity=".5" />
    <path id="Red50" d="M 0 125 L 0 225 L 100 125 z" fill="#ff00ff" fill-opacity=".5" />
    <g id="TwoBlueTriangles">
      <use xlink:href="#Blue100"/>
      <use xlink:href="#Blue50"/>
    </g>
    <g id="BlueTriangles">
      <use transform="translate(275,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(400,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(525,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(650,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(775,25)" xlink:href="#TwoBlueTriangles"/>
      <use transform="translate(900,25)" xlink:href="#TwoBlueTriangles"/>
    </g>
  </defs>

  <rect fill="none" stroke="blue" x="1" y="1" width="1098" height="648"/>
  <g font-family="Verdana" font-size="40" shape-rendering="crispEdges">
    <desc>Render the examples using the filters that draw on top of
          an opaque white surface, thus obliterating the background.</desc>
    <g isolation="isolate">
      <text x="15" y="75">opacity 1.0</text>
      <text x="15" y="115" font-size="27">(with feFlood)</text>
      <text x="15" y="200">opacity 0.5</text>
      <text x="15" y="240" font-size="27">(with feFlood)</text>
      <use xlink:href="#BlueTriangles"/>
      <g transform="translate(275,25)">
        <use xlink:href="#Red100" filter="url(#overFlood)" />
        <use xlink:href="#Red50" filter="url(#overFlood)" />
        <text x="5" y="275">over</text>
      </g>
      <g transform="translate(400,25)">
        <use xlink:href="#Red100" filter="url(#inFlood)" />
        <use xlink:href="#Red50" filter="url(#inFlood)" />
        <text x="35" y="275">in</text>
      </g>
      <g transform="translate(525,25)">
        <use xlink:href="#Red100" filter="url(#outFlood)" />
        <use xlink:href="#Red50" filter="url(#outFlood)" />
        <text x="15" y="275">out</text>
      </g>
      <g transform="translate(650,25)">
        <use xlink:href="#Red100" filter="url(#atopFlood)" />
        <use xlink:href="#Red50" filter="url(#atopFlood)" />
        <text x="10" y="275">atop</text>
      </g>
      <g transform="translate(775,25)">
        <use xlink:href="#Red100" filter="url(#xorFlood)" />
        <use xlink:href="#Red50" filter="url(#xorFlood)" />
        <text x="15" y="275">xor</text>
      </g>
      <g transform="translate(900,25)">
        <use xlink:href="#Red100" filter="url(#arithmeticFlood)" />
        <use xlink:href="#Red50" filter="url(#arithmeticFlood)" />
        <text x="-25" y="275">arithmetic</text>
      </g>
    </g>
    <g transform="translate(0,325)" isolation="isolate">
    <desc>Render the examples using the filters that do not obliterate
          the background, thus sometimes causing the background to continue
          to appear in some cases, and in other cases the background
          image blends into itself ("double-counting").</desc>
      <text x="15" y="75">opacity 1.0</text>
      <text x="15" y="115" font-size="27">(without feFlood)</text>
      <text x="15" y="200">opacity 0.5</text>
      <text x="15" y="240" font-size="27">(without feFlood)</text>
      <use xlink:href="#BlueTriangles"/>
      <g transform="translate(275,25)">
        <use xlink:href="#Red100" filter="url(#overNoFlood)" />
        <use xlink:href="#Red50" filter="url(#overNoFlood)" />
        <text x="5" y="275">over</text>
      </g>
      <g transform="translate(400,25)">
        <use xlink:href="#Red100" filter="url(#inNoFlood)" />
        <use xlink:href="#Red50" filter="url(#inNoFlood)" />
        <text x="35" y="275">in</text>
      </g>
      <g transform="translate(525,25)">
        <use xlink:href="#Red100" filter="url(#outNoFlood)" />
        <use xlink:href="#Red50" filter="url(#outNoFlood)" />
        <text x="15" y="275">out</text>
      </g>
      <g transform="translate(650,25)">
        <use xlink:href="#Red100" filter="url(#atopNoFlood)" />
        <use xlink:href="#Red50" filter="url(#atopNoFlood)" />
        <text x="10" y="275">atop</text>
      </g>
      <g transform="translate(775,25)">
        <use xlink:href="#Red100" filter="url(#xorNoFlood)" />
        <use xlink:href="#Red50" filter="url(#xorNoFlood)" />
        <text x="15" y="275">xor</text>
      </g>
      <g transform="translate(900,25)">
        <use xlink:href="#Red100" filter="url(#arithmeticNoFlood)" />
        <use xlink:href="#Red50" filter="url(#arithmeticNoFlood)" />
        <text x="-25" y="275">arithmetic</text>
      </g>
    </g>
  </g>
</svg>
feComposite 示例

feComposite 示例

以 SVG 格式查看此示例

9.9. 滤镜原语 feConvolveMatrix

名称: feConvolveMatrix
类别: 滤镜原语
内容模型: 任意数量的 描述性元素, animate, script, set 元素,顺序不限。
属性:
DOM接口: SVGFEConvolveMatrixElement

feConvolveMatrix应用矩阵卷积滤镜效果。卷积将输入图像中的像素与邻近的像素结合,以生成输出图像。通过卷积可以实现各种成像操作,包括模糊、边缘检测、锐化、浮雕和斜角等。

矩阵卷积基于一个n乘m的矩阵(卷积核),该矩阵描述了如何将输入图像中的像素值与邻近的像素值组合起来生成输出的像素值。通过对源像素及其相邻像素应用核矩阵,确定每个输出像素。每个像素的颜色值通过以下基本卷积公式计算得出:

color X , Y = i = 0 orderY 1 j = 0 orderX 1 source x targetX + j , y targetY + i kernalMatrix orderX j 1, orderY i 1 divisor + bias alpha x , y func color_{X , Y} = { sum from{i=0} to{func orderY -1} sum from{j=0} to{func orderX -1} func source_{x - func targetX + j , y - targetY + i} cdot func kernalMatrix_{func orderX - j - 1, func orderY - i - 1 }} over {func divisor} + func bias cdot func alpha_{x,y}

其中“orderX”和“orderY”表示order属性的X和Y值,“targetX”表示targetX属性的值,“targetY”表示targetY属性的值,“kernelMatrix”表示kernelMatrix属性的值,“divisor”表示divisor属性的值,“bias”表示bias属性的值。

在上述公式中,卷积矩阵的值应用时相对于源图像和目标图像旋转180度,以符合许多计算机图形学教材中描述的卷积理论。

举例来说,假设你有一个5像素×5像素的输入图像,其颜色通道之一的色值如下:

0 20 40 235 235 100 120 140 235 235 200 220 240 235 235 255 255 255 255 255 255 255 255 255 255 left[ matrix {0 # 20 # 40 # 235 # 235 ## 100 # 120 # 140 # 235 # 235 ## 200 # 220 # 240 # 235 # 235 ## 255 # 255 # 255 # 255 # 255 ## 255 # 255 # 255 # 255 # 255} right]

并且你定义了一个3×3的卷积核,如下所示:

1 2 3 4 5 6 7 8 9 left[ matrix {1 # 2 # 3 ## 4 # 5 # 6 ## 7 # 8 # 9} right]

让我们关注图像中第二行第二列的颜色值(源像素值为120)。假设最简单的情况(输入图像的像素网格与卷积核的像素网格完美对齐),并假设属性 divisortargetXtargetY 的默认值,那么生成的颜色值将为:

resultChannel 2,2 = 9 0 + 8 20 + 7 40 + 6 100 + 5 120 + 4 140 + 3 200 + 2 220 + 1 240 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 func resultChannel_2,2 = {{9 cdot 0} + {8 cdot 20} + {7 cdot 40} + {6 cdot 100} + {5 cdot 120} + {4 cdot 140} + {3 cdot 200} + {2 cdot 220} + {1 cdot 240}} over {9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1}

因为它们对像素进行操作,矩阵卷积本质上是依赖分辨率的。为了使 feConvolveMatrix 产生与分辨率无关的结果,应该为属性 kernelUnitLength 提供一个明确的值。

kernelUnitLength,与其他属性一起,定义了滤镜效果坐标系中的一个隐式像素网格(即由 primitiveUnits 属性建立的坐标系)。输入图像将被临时重新缩放以使其像素与 kernelUnitLength 匹配。卷积操作将在重采样后的图像上进行,卷积完成后,图像会被重新采样回原始分辨率。

当图像必须重采样以匹配由 kernelUnitLength 定义的坐标系统时,或者在卷积后需要重采样回设备坐标系统时,建议高质量的查看器使用合适的插值技术,例如双线性或双三次插值。根据可用插值的速度,此选择可能会受到 image-rendering 属性设置的影响。请注意,当文档被放大或缩小时,kernelUnitLength 相对于设备像素非常小时,实现可能选择最小化或消除不必要的重采样。

属性定义:

order = "<number-optional-number>"

指示 kernelMatrix 中每个维度的单元格数量。提供的值必须为 <integer>,且大于零。非整数值将被截断,即四舍五入为最接近的整数。第一个数字 <orderX> 表示矩阵中的列数,第二个数字 <orderY> 表示矩阵中的行数。如果未提供 <orderY>,则默认为 <orderX>。

建议只使用较小的值(例如 3);较高的值可能会导致非常高的 CPU 开销,通常不会产生值得这种性能影响的结果。

order 的初始值为 3

可动画: 是。

kernelMatrix = "<list of numbers>"

表示用于卷积的核矩阵。<number> 值列表。值由空格字符和/或逗号分隔。列表中的条目数必须等于 <orderX> 乘以 <orderY>。

如果 orderX * orderY 的结果与值列表中的条目数不相等,则滤镜原语将充当 通过滤镜

可动画: 是。

divisor = "<number>"

在将 kernelMatrix 应用于输入图像并生成数字后,将该数字除以 divisor 以生成最终的目标颜色值。如果指定的除数为 0,则将使用默认值。

divisor 的初始值是 kernelMatrix 所有值的总和。如果总和为零,则除数设置为 1

可动画: 是。

bias = "<number>"

在将 kernelMatrix 应用于输入图像并生成一个数值后,应用 divisor,然后将 bias 属性添加到每个组件中。

一个使用 bias 的应用场景是当希望将 0.5 灰度值作为滤镜的零响应时。bias 属性可以调整滤镜的范围,允许表示原本会被钳制到 0 或 1 的值。

bias 的初始值为 0

可动画: 是。

targetX = "<integer>"

决定卷积矩阵相对于输入图像中给定目标像素在 X 方向上的定位。矩阵的最左列为第零列。值必须满足:0 <= targetX < orderX。默认情况下,卷积矩阵在每个像素的 X 方向上居中(即 targetX = floor(orderX / 2))。

可动画: 是。

targetY = "<integer>"

决定卷积矩阵相对于输入图像中给定目标像素在 Y 方向上的定位。矩阵的最上行为第零行。值必须满足:0 <= targetY < orderY。默认情况下,卷积矩阵在每个像素的 Y 方向上居中(即 targetY = floor(orderY / 2))。

可动画: 是。

edgeMode = "duplicate | wrap | none"

决定如何根据需要扩展输入图像的颜色值,以便当卷积核定位在或接近输入图像边缘时可以应用矩阵操作。

duplicate 表示输入图像将沿其边界按需扩展,通过复制给定边缘的颜色值。

原始 N-by-M 图像,其中 m=M-1 和 n=N-1:

11 12 . . . 1 m 1 M 21 22 . . . 2 m 2 M . . . . . . . . . . . . . . . n 1 n 2 . . . nm nM N 1 N 2 . . . Nm NM left[ matrix {11 # 12 # { "." "." "."} # {1 m} # {1 M} ## 21 # 22 # { "." "." "."} # {2 m} # {2 M} ## { "." "." "."} # { "." "." "."} # { "." "." "."} # { "." "." "."} # { "." "." "."} ## {n 1} # {n 2} # { "." "." "."} # func nm # func nM ## {N 1} # {N 2} # { "." "." "."} # func Nm # func NM} right]

通过使用 duplicate 扩展两个像素:

11 11 11 12 1 m 1 M 1 M 1 M 11 11 11 12 1 m 1 M 1 M 1 M 11 11 11 12 1 m 1 M 1 M 1 M 21 21 21 22 2 m 2 M 2 M 2 M n 1 n 1 n 1 n 2 nm nM nM nM N 1 N 1 N 1 N 2 Nm NM NM NM N 1 N 1 N 1 N 2 Nm NM NM NM N 1 N 1 N 1 N 2 Nm NM NM NM left[ matrix {11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 11 # 11 # 11 # 12 # dotslow # {1 m} # {1 M} # {1 M} # {1 M} ## 21 # 21 # 21 # 22 # dotslow # {2 m} # {2 M} # {2 M} # {2 M} ## dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow ## {n 1} # {n 1} # {n 1} # {n 2} # dotslow # func nm # func nM # func nM # func nM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM ## {N 1} # {N 1} # {N 1} # {N 2} # dotslow # func Nm # func NM # func NM # func NM} right]

wrap 表示输入图像通过取自图像相对边缘的颜色值进行扩展。

通过使用 wrap 扩展两个像素:

nm nM n1 n2 nm nM n1 n2 Nm NM N1 N2 Nm NM N1 N2 1m 1M 11 12 1m 1M 11 12 2m 2M 21 22 2m 2M 21 22 nm nM n1 n2 nm nM n1 n2 Nm NM N1 N2 Nm NM N1 N2 1m 1M 11 12 1m 1M 11 12 2m 2M 21 22 2m 2M 21 22 left[ matrix { nm # nM # n1 # n2 # dotslow # nm # nM # n1 # n2 ## Nm # NM # N1 # N2 # dotslow # Nm # NM # N1 # N2 ## 1m # 1M # 11 # 12 # dotslow # 1m # 1M # 11 # 12 ## 2m # 2M # 21 # 22 # dotslow # 2m # 2M # 21 # 22 ## dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow # dotslow ## nm # nM # n1 # n2 # dotslow # nm # nM # n1 # n2 ## Nm # NM # N1 # N2 # dotslow # Nm # NM # N1 # N2 ## 1m # 1M # 11 # 12 # dotslow # 1m # 1M # 11 # 12 ## 2m # 2M # 21 # 22 # dotslow # 2m # 2M # 21 # 22 } right]

none 的值表示输入图像以 R、G、B 和 A 的像素值为零进行扩展。

初始值edgeMode 的值为 duplicate

可动画: 是。

kernelUnitLength = "<number-optional-number>"

第一个数字是 <dx> 值。第二个数字是 <dy> 值。如果未指定 <dy> 值,则默认与 <dx> 值相同。表示当前滤镜单位中的预期距离 (即由 primitiveUnits 属性的值决定的单位)内连续列和行之间的距离。通过为 kernelUnitLength 提供值,内核定义在可缩放的抽象坐标系中。 如果未指定 kernelUnitLength,默认值为屏幕外位图中的一个像素, 这是基于像素的坐标系统,因此可能不可缩放。为了在显示媒体和用户代理之间保持某种一致性,建议为 kernelUnitLength 提供一个值。在某些实现中,如果临时屏幕外图像的像素网格与内核的像素网格对齐, 将会实现最一致的结果和最快的性能。

如果指定了负值或零值,则使用默认值。

注意: 此属性已被弃用,将被移除。它无法提供创建平台无关结果的可靠方式。未来版本的规范将涵盖此用例。

可动画: 是。

preserveAlpha = "false | true"

值为 false 表示卷积将应用于所有通道,包括 alpha 通道。在这种情况下,给定像素的 ALPHAX,Y 卷积公式为:

ALPHAX,Y = (
SUM I=0 to [orderY-1] {
SUM J=0 to [orderX-1] {
SOURCE X-targetX+J, Y-targetY+I * kernelMatrixorderX-J-1, orderY-I-1
}
}
) / divisor + bias

值为 "true" 表示卷积将仅应用于颜色通道。在这种情况下,滤镜会暂时取消颜色分量值的预乘并应用卷积核。在这种情况下,给定像素的 ALPHAX,Y 卷积公式为:

ALPHAX,Y = SOURCEX,Y

preserveAlpha 属性的初始值为 false

可动画: 是。

9.10. 滤镜原语 feDiffuseLighting

名称: feDiffuseLighting
类别: 滤镜原语
内容模型: 任何数量的描述性元素script,且恰好有一个光源元素,顺序不限。
属性:
DOM 接口: SVGFEDiffuseLightingElement

此滤镜原语使用 Alpha 通道作为浮雕图照亮图像。生成的图像是基于光颜色的 RGBA 不透明图像,alpha = 1.0 到处都是。照明计算遵循 Phong 照明模型的标准漫反射组件。生成的图像取决于光的颜色、光的位置以及输入浮雕图的表面几何形状。

此滤镜原语生成的光图可以使用 算术 feComposite 合成方法的乘法项与纹理图像结合。可以通过在将其应用于纹理图像之前将多个这些光图相加来模拟多个光源

下列公式使用 3x3 滤镜。由于它们在像素上操作,这类滤镜本质上是分辨率依赖的。为了使 feDiffuseLighting 生成与分辨率无关的结果,应为属性 kernelUnitLength 提供明确的值。

kernelUnitLength 与其他属性结合定义了滤镜效果坐标系中的隐式像素网格(即由primitiveUnits 属性建立的坐标系)。输入图像将被临时重新缩放以使其像素与 kernelUnitLength 匹配。3x3 滤镜将应用于重新采样的图像。应用滤镜后,图像将重新采样回其原始分辨率。

注意: 根据可用插值器的速度,此选择可能会受到 image-rendering 属性设置的影响。

注意: 实现可能会选择在不需要重新采样以生成正确结果时尽量减少或消除重新采样的方式,例如当文档缩小到 kernelUnitLength 显著小于设备像素时。

对于以下公式,Norm(Ax,Ay,Az) 函数定义为:

Norm ( A x , A y , A z ) = A x 2 + A y 2 + A z 2 Norm(A_x,A_y,A_z) = sqrt { A_x^2+A_y^2+A_z^2}

注意: 用户代理可以使用“快速逆平方根”优化方程并避免极端颜色值上的时间差异。有关时间攻击的更多详细信息,请参阅隐私和安全注意事项部分。

生成的 RGBA 图像按如下方式计算:

Dr = kd * N.L * Lr
Dg = kd * N.L * Lg
Db = kd * N.L * Lb
Da = 1.0

其中

kd = 漫反射光照常数
N = 表面法线单位向量,x 和 y 的函数
L = 从表面指向光源的单位向量,在点光源和聚光灯情况下是 x 和 y 的函数
Lr,Lg,Lb = 光的 RGB 分量,在聚光灯情况下是 x 和 y 的函数

N 是 x 和 y 的函数,取决于表面梯度,计算如下:

输入 alpha 图像 I(x,y) 描述的表面为:

Z (x,y) = surfaceScale * I(x,y)

表面法线使用 Sobel 梯度 3x3 滤波器计算。不同的滤波器核根据像素是在内部还是在边缘而有所不同。每种情况下的公式如下:

Nx (x,y) = - surfaceScale * FACTORx *
(Kx(0,0)*I(x-dx,y-dy) + Kx(1,0)*I(x,y-dy) + Kx(2,0)*I(x+dx,y-dy) +
Kx(0,1)*I(x-dx,y) + Kx(1,1)*I(x,y) + Kx(2,1)*I(x+dx,y) +
Kx(0,2)*I(x-dx,y+dy) + Kx(1,2)*I(x,y+dy) + Kx(2,2)*I(x+dx,y+dy))
Ny (x,y) = - surfaceScale * FACTORy *
(Ky(0,0)*I(x-dx,y-dy) + Ky(1,0)*I(x,y-dy) + Ky(2,0)*I(x+dx,y-dy) +
Ky(0,1)*I(x-dx,y) + Ky(1,1)*I(x,y) + Ky(2,1)*I(x+dx,y) +
Ky(0,2)*I(x-dx,y+dy) + Ky(1,2)*I(x,y+dy) + Ky(2,2)*I(x+dx,y+dy))
Nz (x,y) = 1.0

N = (Nx, Ny, Nz) / Norm((Nx,Ny,Nz))

在这些公式中,dxdy 值(例如,I(x-dx,y-dy))表示相对于给定的 (x,y) 位置的增量,用于估算该点处表面的斜率。这些增量由属性 kernelUnitLength 的显式或隐式值决定。

左上角: 顶行: 右上角:

FACTORx=2/(3*dx)
Kx =
| 0 0 0 |
| 0 -2 2 |
| 0 -1 1 |

FACTORy=2/(3*dy)
Ky =
| 0 0 0 |
| 0 -2 -1 |
| 0 2 1 |

FACTORx=1/(3*dx)
Kx =
| 0 0 0 |
| -2 0 2 |
| -1 0 1 |

FACTORy=1/(2*dy)
Ky =
| 0 0 0 |
| -1 -2 -1 |
| 1 2 1 |

FACTORx=2/(3*dx)
Kx =
| 0 0 0 |
| -2 2 0 |
| -1 1 0 |

FACTORy=2/(3*dy)
Ky =
| 0 0 0 |
| -1 -2 0 |
| 1 2 0 |

左列: 内部像素: 右列:

FACTORx=1/(2*dx)
Kx =
| 0 -1 1 |
| 0 -2 2 |
| 0 -1 1 |

FACTORy=1/(3*dy)
Ky =
| 0 -2 -1 |
| 0 0 0 |
| 0 2 1 |

FACTORx=1/(4*dx)
Kx =
| -1 0 1 |
| -2 0 2 |
| -1 0 1 |

FACTORy=1/(4*dy)
Ky =
| -1 -2 -1 |
| 0 0 0 |
| 1 2 1 |

FACTORx=1/(2*dx)
Kx =
| -1 1 0|
| -2 2 0|
| -1 1 0|

FACTORy=1/(3*dy)
Ky =
| -1 -2 0 |
| 0 0 0 |
| 1 2 0 |

左下角: 底行: 右下角:

FACTORx=2/(3*dx)
Kx =
| 0 -1 1 |
| 0 -2 2 |
| 0 0 0 |

FACTORy=2/(3*dy)
Ky =
| 0 -2 -1 |
| 0 2 1 |
| 0 0 0 |

FACTORx=1/(3*dx)
Kx =
| -1 0 1 |
| -2 0 2 |
| 0 0 0 |

FACTORy=1/(2*dy)
Ky =
| -1 -2 -1 |
| 1 2 1 |
| 0 0 0 |

FACTORx=2/(3*dx)
Kx =
| -1 1 0 |
| -2 2 0 |
| 0 0 0 |

FACTORy=2/(3*dy)
Ky =
| -1 -2 0 |
| 1 2 0 |
| 0 0 0 |

L,单位向量从图像样本到光源的计算如下:

对于无限光源,它是常量:

Lx = cos(azimuth) * cos(elevation)
Ly = sin(azimuth) * cos(elevation)
Lz = sin(elevation)

对于点光源和聚光灯光源,它是位置的函数:

Lx = Lightx - x
Ly = Lighty - y
Lz = Lightz - Z(x,y)

L = (Lx, Ly, Lz) / Norm(Lx, Ly, Lz)

其中 Lightx, Lighty, 和 Lightz 是输入光源的位置。

Lr, Lg, Lb,光源颜色向量,仅在聚光灯情况下为位置函数:

Lr = Lightr * pow((-L.S), specularExponent)
Lg = Lightg * pow((-L.S), specularExponent)
Lb = Lightb * pow((-L.S), specularExponent)

其中 S 是单位向量,指向从光源到平面中的点 (pointsAtX, pointsAtY, pointsAtZ):

Sx = pointsAtX - Lightx
Sy = pointsAtY - Lighty
Sz = pointsAtZ - Lightz

S = (Sx, Sy, Sz) / Norm(Sx, Sy, Sz)

如果 L.S 是正数,则没有光存在。(Lr = Lg = Lb = 0)。如果指定了 limitingConeAngle,则 -L.S < cos(limitingConeAngle) 也表示没有光存在。

属性定义:

surfaceScale = "<number>"

当 Ain = 1 时,表面的高度。

如果未指定属性,则效果如同指定了值 1

可动画: 是。

diffuseConstant = "<number>"

Phong 光照模型中的 kd。在 SVG 中,这可以是任何非负数。

如果未指定属性,则效果如同指定了值 1

可动画: 是。

kernelUnitLength = "<number-optional-number>"

第一个数是 <dx> 值。第二个数是 <dy> 值。如果未指定 <dy> 值,它默认为与 <dx> 相同的值。表示当前过滤器单位(即由属性 primitiveUnits 确定的单位)中列和行之间的距离,分别用于 dxdy

通过为 kernelUnitLength 指定值,内核定义在一个可扩展的抽象坐标系中。

如果 kernelUnitLength 没有指定,dxdy 值应该表示相对于给定 (x,y) 位置的非常小的增量,这在某些情况下可以在中间图像离屏位图中实现。

如果指定了负数或零值,将使用默认值。

注意: 此属性已被弃用,将被移除。它不提供创建平台独立结果的可靠方法。未来版本的规范将涵盖此用例。

可动画: 是。

光源由以下子元素之一定义:feDistantLightfePointLightfeSpotLight。光源颜色由属性 lighting-color 指定。

9.11.过滤器基本元件 feDisplacementMap

名称: feDisplacementMap
类别: 过滤器基本元件
内容模型: 任意数量的描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEDisplacementMapElement

实现与规范不符。<https://github.com/w3c/csswg-drafts/issues/113>

此过滤器基本元件使用来自in2的像素值来对来自in的图像进行空间位移。执行的变换如下:

P'(x,y) ← P( x + scale * (XC(x,y) - .5), y + scale * (YC(x,y) - .5))

其中P(x,y)是输入图像in,P'(x,y)是目标图像。XC(x,y)和YC(x,y)是由xChannelSelectoryChannelSelector指定的通道值的分量。 例如,若要使用in2的R分量控制x方向的位移,G分量控制y方向的位移, 请将xChannelSelector设置为"R",yChannelSelector设置为"G"。

位移图in2定义了所执行映射的逆过程。

输入图像in在此过滤器基本元件中保持预乘处理。使用in2的像素值进行的计算使用未预乘的颜色值。

该过滤器对输入可以产生任意非局部化的效果,这可能需要处理管道中大量的缓冲。然而,使用此公式,任何中间缓冲需求可以通过scale属性来确定,scale属性表示x或y方向上的最大位移范围。

在应用此过滤器时,源像素位置通常位于多个源像素之间。

注意:根据可用插值器的速度,此选择可能会受到图像渲染属性设置的影响。

注意:此规范的未来版本将定义扭曲源图像时使用的插值方法,从而使用户代理的渲染结果更加一致。

颜色插值过滤器属性仅适用于in2源图像, 不适用于in源图像。in源图像必须保持其当前的颜色空间。

属性定义:

scale = "<number>"

位移缩放因子。数量以由primitiveUnits属性在过滤器元素上建立的坐标系中表达。

当该属性的值为0时,此操作对源图像无影响。

初始值0

可动画:是。

xChannelSelector = "R | G | B | A"

指示从in2使用哪个通道来沿x轴位移in中的像素。

初始值A

可动画:是。

yChannelSelector = "R | G | B | A"

指示从in2使用哪个通道来沿y轴位移in中的像素。

初始值A

可动画:是。

in2 = "(参见in属性)"

第二个输入图像,用于位移属性in中的像素。详见in属性的定义。

可动画:是。

9.12. 过滤器基本元件 feDropShadow

名称: feDropShadow
类别: 过滤器基本元件
内容模型: 任意数量的描述元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEDropShadowElement

此滤镜会为输入图像创建一个投影。它是一个简写滤镜,定义为其他 滤镜基元的组合。预期是实现可以更容易地优化。

一个 feDropShadow 滤镜基元的结果等同于以下内容:

<feGaussianBlur in="alpha-channel-of-feDropShadow-in" stdDeviation="stdDeviation-of-feDropShadow"/> 
<feOffset dx="dx-of-feDropShadow" dy="dy-of-feDropShadow" result="offsetblur"/> 
<feFlood flood-color="flood-color-of-feDropShadow" flood-opacity="flood-opacity-of-feDropShadow"/> 
<feComposite in2="offsetblur" operator="in"/> 
<feMerge>
  <feMergeNode/> 
  <feMergeNode in="in-of-feDropShadow"/> 
</feMerge> 

以上步骤如下:

  1. 获取输入到 feDropShadow 滤镜基元的 alpha 通道, 并根据 stdDeviation 进行处理, 如同应用以下 feGaussianBlur

    <feGaussianBlur in="alpha-channel-of-feDropShadow-in" stdDeviation="stdDeviation-of-feDropShadow"/>
    
  2. 使用在 feDropShadow 元素中指定的 dxdy 偏移第 1 步的结果, 相当于应用以下带有这些参数的 feOffset

    <feOffset dx="dx-of-feDropShadow" dy="dy-of-feDropShadow" result="offsetblur"/>
    
  3. 如同应用了一个 feFlood 元素, 并使用 flood-colorflood-opacity,如同在 feDropShadow 中指定:

    <feFlood flood-color="flood-color-of-feDropShadow" flood-opacity="flood-opacity-of-feDropShadow"/>
    
  4. 将第 3 步中的 feFlood 结果与第 2 步中的 feOffset 结果合成, 如同应用了一个 feComposite 滤镜基元, 且 operator="in"

    <feComposite in2="offsetblur" operator="in"/>
    
  5. 最终合并前一步的结果,如同执行以下 feMerge

    <feMerge> 
      <feMergeNode/>
      <feMergeNode in="in-of-feDropShadow"/> 
    </feMerge> 
    

注意:虽然 feDropShadow 滤镜基元的定义说可以将其扩展为等效树, 但不要求必须这样实现。期望用户代理可以通过不必单独执行所有步骤来优化处理。

除了 DOM 接口 SVGFEDropShadowElement 之外,无法访问 feDropShadow 滤镜基元的内部, 这意味着如果滤镜基元实现为等效树,那么该树不应暴露给 DOM。

属性定义:

dx = "<number>"

投影的 x 偏移量。

初始值dx2

此属性随后会传递给内部 feOffset 元素的 dx 属性。

可动画化:是。

dy = "<number>"

投影的 y 偏移量。

初始值dy2

此属性随后会传递给内部 feOffset 元素的 dy 属性。

可动画化:是。

stdDeviation = "<number-optional-number>"

投影模糊操作的标准偏差。

初始值stdDeviation2

此属性随后会传递给内部 feGaussianBlur 元素的 stdDeviation 属性。

可动画化:是。

9.13. 滤镜基元 feFlood

名称: feFlood
分类: 滤镜基元
内容模型: 任意数量的 描述性元素animatescriptset元素,顺序不限。
属性:
DOM 接口: SVGFEFloodElement

此滤镜基元会创建一个矩形,并填充 flood-colorflood-opacity 属性的颜色和不透明度值。该矩形与 滤镜基元子区域 一样大,该区域由 feFlood 元素建立。

9.13.1. 属性 flood-color

名称: flood-color
值: <color>
初始值: black
适用对象: feFloodfeDropShadow 元素
继承: no
百分比: n/a
计算值: 按指定值
标准顺序: 按语法
媒体类型: 视觉
可动画: 计算值

flood-color 属性指定用于填充当前 滤镜基元子区域 的颜色。

flood-color 属性是 SVG 元素的 表示属性

9.13.2. 属性 flood-opacity

名称: flood-opacity
值: <alpha-value>
初始值: 1
适用对象: feFloodfeDropShadow 元素
继承: no
百分比: n/a
计算值: 指定值转换为数字,并限制在 [0,1] 范围内
标准顺序: 按语法
媒体类型: 视觉
可动画: 按计算值

flood-opacity 属性定义了用于整个 滤镜基元子区域 的不透明度值。如果 flood-color 值包含 alpha 通道,则 alpha 通道会与 flood-opacity 属性的计算值相乘。

flood-opacity 属性是 SVG 元素的 表示属性

9.14. 滤镜基元 feGaussianBlur

名称: feGaussianBlur
类别: 滤镜基元
内容模型: 可包含任意数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEGaussianBlurElement

此滤镜原语对输入图像执行高斯模糊操作。

高斯模糊核是标准化卷积的近似值:

G(x,y) = H(x)I(y)

其中

H(x) = exp(-x2/ (2s2)) / sqrt(2π * s2)

I(y) = exp(-y2/ (2t2)) / sqrt(2π * t2)

其中 "s" 为 x 方向上的标准差,"t" 为 y 方向上的标准差,由 stdDeviation 指定。

stdDeviation 的值可以是一个或两个数值。如果提供两个数值,第一个数值代表当前坐标系 x 轴上的标准差,第二个数值代表 Y 轴上的标准差。如果只提供一个数值,则该值将同时用于 X 和 Y。

即使只为 stdDeviation 提供一个值,也可以实现为可分离卷积。

对于较大的 "s" 值(s >= 2.0),可以使用近似值:连续三个盒状模糊构建一个分段二次卷积核,该核将高斯核近似到约 3% 的范围内。

let d = floor(s * 3 * sqrt(2 * π) / 4 + 0.5)

…… 如果 d 是奇数,使用三个大小为 "d" 的盒状模糊,居中于输出像素。

…… 如果 d 是偶数,使用两个大小为 "d" 的盒状模糊(第一个居中于输出像素和左侧像素之间的像素边界,第二个居中于输出像素和右侧像素之间的像素边界),以及一个大小为 "d+1" 的盒状模糊居中于输出像素。

近似公式也适用于 "t"。

这种操作通常应用于仅包含 alpha 通道的图像,例如由内置输入 SourceAlpha 生成的图像。实现可能会注意到这一点并优化单通道情况。如果导致任何隐私问题,此优化必须省略。(有关计时攻击的更多详细信息,请参见 隐私和安全注意事项 部分。)如果输入具有无限范围并且是常量(例如填充为纯色的 FillPaint),则此操作没有效果。如果输入具有无限范围并且滤镜结果是输入到 feTile 的纯色填充,则滤镜以周期边界条件 评估。

属性定义:

stdDeviation = "<number-optional-number>"

模糊操作的标准差。如果提供两个 <number>,第一个数值表示由 primitiveUnitsfilter 元素上建立的坐标系 x 轴上的标准差。第二个值表示 Y 轴上的标准差。如果只提供一个数值,则该值用于 X 和 Y。

负值或零值会禁用给定滤镜原语的效果(即,结果为滤镜输入图像)。

如果 stdDeviation 在 X 或 Y 方向上仅为 0,则效果是仅在具有非零值的方向上应用模糊。

对于 初始值stdDeviation0

可动画: 是。

edgeMode = "duplicate | wrap | none"

确定如何在必要时使用颜色值扩展输入图像,以便在核位于或接近输入图像边缘时可以应用矩阵操作。

duplicate 表示输入图像沿每个边缘按需扩展,通过复制输入图像边缘的颜色值。

原始 N-by-M 图像,其中 m=M-1 和 n=N-1:

wrap 表示输入图像通过从图像的相对边缘获取颜色值来扩展。

none 表示输入图像用 R、G、B 和 A 的像素值为零扩展。

对于 初始值edgeModenone

可动画: 是。

本章开头的示例 使用 feGaussianBlur 滤镜原语来创建投影效果。

9.15. 滤镜原语 feImage

名称: feImage
分类: 滤镜原语
内容模型: 任意数量的 描述性元素animateanimateTransformscriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEImageElement

此滤镜基元引用了该滤镜元素外部的图形,并将其加载或渲染为RGBA栅格,成为滤镜基元的结果。

此滤镜基元可以引用外部图像或SVG的其他部分。它生成的图像类似于内置的图像源SourceGraphic,但图像来自外部来源。

如果href引用的是独立的图像资源(如JPEG、PNG或SVG文件),则图像资源将按照image元素的行为进行渲染;否则,引用的资源将根据use元素的行为进行渲染。无论哪种情况,当前用户坐标系统取决于滤镜元素上primitiveUnits属性的值。preserveAspectRatio属性在feImage元素上的处理与image元素相同。

如果href引用的图像为空(宽度或高度为零)、下载失败、不存在或无法显示(例如因为它不是受支持的图像格式),则会用透明黑色填充滤镜基元子区域。

当引用的图像必须重新采样以匹配设备坐标系统时,建议高质量的查看器使用适当的插值技术,例如双线性或双三次插值。 根据可用插值器的速度,此选择可能会受到image-rendering属性设置的影响。

属性定义:

xlink:href = "<url>"

参见 href 属性。

可动画: 是。

注意:xlink:href 属性已弃用,不应在新内容中使用,它仅为向后兼容原因而保留。作者应使用 href 属性代替。

href = "<url>"

一个 <url> 指向图像资源或元素。如果同时存在 xlink:hrefhref 属性,则后者覆盖前者。

可动画: 是。

preserveAspectRatio = "[defer] <align> [<meetOrSlice>]"

参见 preserveAspectRatio 属性。

初始值xMidYMid meet

可动画: 是。

crossorigin = "anonymous | use-credentials"

crossorigin 属性是一个CORS设置属性。其目的是允许来自允许跨域访问的第三方站点的图像与 feDisplacementMap 一起使用。定义详见 crossorigin 属性,适用于 img 标签 [HTML5],以及本规范中的 隐私与安全考虑 部分。

可动画: 否。

以下示例说明了图像相对于对象的放置方式。从左到右:

<svg width="600" height="250" viewBox="0 0 600 250"
     xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink">
  <title>Example feImage - Examples of feImage use</title>
  <desc>Three examples of using feImage, the first showing the
        default rendering, the second showing the image fit
        to a box and the third showing the image
        shifted and clipped.</desc>
  <defs>
    <filter id="Default">
      <feImage xlink:href="smiley.png" />
    </filter>
    <filter id="Fitted" primitiveUnits="objectBoundingBox">
      <feImage xlink:href="smiley.png"
         x="0" y="0" width="100%" height="100%"
         preserveAspectRatio="none"/>
    </filter>
    <filter id="Shifted">
      <feImage xlink:href="smiley.png"
         x="500" y="5"/>
    </filter>
  </defs>
  <rect fill="none" stroke="blue"
        x="1" y="1" width="598" height="248"/>
  <g>
    <rect x="50"  y="25" width="100" height="200" filter="url(#Default)"/>
    <rect x="50"  y="25" width="100" height="200" fill="none" stroke="green"/>
    <rect x="250" y="25" width="100" height="200" filter="url(#Fitted)"/>
    <rect x="250" y="25" width="100" height="200" fill="none" stroke="green"/>
    <rect x="450" y="25" width="100" height="200" filter="url(#Shifted)"/>
    <rect x="450" y="25" width="100" height="200" fill="none" stroke="green"/>
  </g>
</svg>
Example feImage — Examples of feImage use

feImage 示例

以SVG格式查看此示例

9.16. 滤镜基元 feMerge

名称: feMerge
类别: 滤镜基元
内容模型: 任意数量的 描述性元素, feMergeNode, script 元素,以任意顺序排列。
属性:
DOM 接口: SVGFEMergeElement

此滤镜基元使用 over 操作符将输入图像层彼此叠加,Input1(对应于第一个feMergeNode子元素)位于底部,最后指定的输入InputN(对应于最后一个feMergeNode子元素)位于顶部。

许多效果会生成多个中间层以创建最终的输出图像。此滤镜允许我们将这些图层合并为一个图像。虽然可以通过使用n-1个合成滤镜来实现这一点,但以这种形式提供这一常见操作更为方便,并为实现提供了额外的灵活性。

每个feMerge元素可以具有任意数量的feMergeNode子元素,每个子元素都有一个in属性。

feMerge的典型实现是将整个效果渲染到一个RGBA图层中,然后将结果图层渲染到输出设备上。在某些情况下(尤其是当输出设备本身是连续色调设备时),并且由于合并是关联的,对效果进行逐层评估并从下到上逐层渲染到输出设备上可能是一种足够的近似。

如果最顶层的图像输入是SourceGraphic,并且此feMerge是滤镜中的最后一个滤镜基元,建议实现首先渲染到该点的所有图层,然后直接从其矢量描述中渲染SourceGraphic至顶部。

此章节开头的示例使用了feMerge滤镜基元将两个中间滤镜结果合并在一起。

9.16.1. 合并节点 feMergeNode

名称: feMergeNode
分类: 无。
内容模型: 任意数量的描述性元素animatescriptset元素,顺序不限。
属性:
DOM 接口: SVGFEMergeNodeElement

9.17. 滤镜原语 feMorphology

名称: feMorphology
分类: 滤镜原语
内容模型: 任意数量的描述性元素animatescriptset元素,顺序不限。
属性:
DOM 接口: SVGFEMorphologyElement

该滤镜原语执行图形的“加粗”或“变细”操作。它对于加粗或变细 Alpha 通道特别有用。

膨胀(或腐蚀)核是一个宽度为 2*x-radius 和高度为 2*y-radius 的矩形。在膨胀操作中,输出像素是输入图像内核矩形中相应 R、G、B、A 值的逐组件最大值。在腐蚀操作中,输出像素是输入图像内核矩形中相应 R、G、B、A 值的逐组件最小值。

这种操作通常会在仅包含 Alpha 通道的图像上进行,例如由内置输入 SourceAlpha 生成的图像。在这种情况下,实施可能会希望优化单通道处理。但如果此优化会引发任何隐私问题,则必须省略此优化。(有关详细信息,请参阅 隐私和安全考虑部分。)

如果输入具有无限扩展且恒定(例如,FillPaint 填充的是纯色),则该操作无效。如果输入具有无限扩展且滤镜结果是输入到 feTile 的结果,则该滤镜将使用周期性边界条件进行评估。

由于 feMorphology 在预乘色值上运行,它的结果色值总是小于或等于 Alpha 通道。

属性定义:

operator = "erode | dilate"

一个关键字,用于指示是侵蚀(即变细)还是膨胀(加粗)源图形。

初始值operatorerode

可动画: 是。

radius = "<number-optional-number>"

操作的半径。如果提供了两个<number>值,第一个值表示 x 半径,第二个值表示 y 半径。如果只提供一个值,则该值同时用于 X 和 Y。这些值是在由 primitiveUnits 属性在 filter 元素上建立的坐标系中使用。

负值或零值会禁用给定滤镜原语的效果(即,结果是滤镜输入图像)。

初始值radius0

可动画: 是。

<svg width="5cm" height="7cm" viewBox="0 0 700 500"
     xmlns="http://www.w3.org/2000/svg">
  <title>Example feMorphology - Examples of erode and dilate</title>
  <desc>Five text strings drawn as outlines.
        The first is unfiltered. The second and third use 'erode'.
        The fourth and fifth use 'dilate'.</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="2"
        x="1" y="1" width="698" height="498"/>
  <g isolation="isolate" >
    <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>
feMorphology示例

feMorphology 示例

以SVG格式查看此示例

9.18. 滤镜原语 feOffset

名称: feOffset
类别: 滤镜原语
内容模型: 任意数量的 描述性元素, animate, script, set 元素,顺序不限。
属性:
DOM 接口: SVGFEOffsetElement

该过滤器原语根据指定的向量相对于图像空间中的当前位置偏移输入图像。

这对于诸如阴影效果等效果非常重要。

应用此过滤器时,目标位置可能会在设备空间内偏移小于一个像素的距离。 在这种情况下,高质量的查看器应使用适当的插值技术,例如双线性或双三次插值。 这对于提供图像平滑移动的动态查看器尤为重要。对于静态查看器,这不是主要问题。应密切关注image-rendering属性设置以确定作者的意图。

属性定义:

dx = "<number>"

沿x轴偏移输入图形的量。偏移量以primitiveUnits属性在filter 元素上建立的坐标系中表示。

初始值dx0

可动画:是。

dy = "<number>"

沿y轴偏移输入图形的量。偏移量以primitiveUnits属性在filter 元素上建立的坐标系中表示。

初始值dy0

可动画:是。

本章开头的示例使用feOffset过滤器原语将阴影从原始源图形偏移。

9.19. 过滤器原语 feSpecularLighting

名称: feSpecularLighting
类别: 过滤器原语
内容模型: 可包含任意数量的描述性元素脚本,并且必须包含一个光源元素,顺序不限。
属性:
DOM 接口: SVGFESpecularLightingElement

此滤镜基元使用 alpha 通道作为凹凸贴图来照亮源图形。生成的图像是基于光的颜色的 RGBA 图像。光照计算遵循 Blinn-Phong 光照模型的标准镜面反射组件。生成的图像取决于光的颜色、光的位置和输入凹凸贴图的表面几何形状。光照计算的结果被相加。滤镜基元假设观察者在 z 方向上的无穷远处(即,眼睛方向的单位向量在任何地方都是 (0,0,1))。

注意: 此滤镜基元生成的图像包含光照计算的镜面反射部分。此类贴图旨在与第二个滤镜基元的纹理使用 加法 项通过 feComposite 方法的 算术 合并。可以通过在应用到纹理图像之前将多个这些光照贴图相加来模拟多个光源。

生成的 RGBA 图像按以下方式计算:

Sr = ks * pow(N.H, specularExponent) * Lr
Sg = ks * pow(N.H, specularExponent) * Lg
Sb = ks * pow(N.H, specularExponent) * Lb
Sa = max(Sr, Sg, Sb)

其中

ks = 镜面反射常数
N = 表面法线单位向量,是 x 和 y 的函数
H = 眼睛单位向量和光源单位向量之间的“中途”单位向量

Lr,Lg,Lb = 光的 RGB 组件

请参见 feDiffuseLighting 以了解 N 和 (Lr, Lg, Lb) 的定义。

H 的定义反映了我们对恒定眼向量 E = (0,0,1) 的假设:

H = (L + E) / Norm(L+E)

其中 L 是光源单位向量。

feDiffuseLighting 不同,feSpecularLighting 滤镜生成的是不透明图像。这是因为镜面反射结果 (Sr,Sg,Sb,Sa) 是为了添加到纹理图像中。结果的 alpha 通道是颜色组件的最大值,因此当镜面光为零时,不会向图像添加额外的覆盖,而完全白色的高光将增加不透明度。

feDiffuseLightingfeSpecularLighting 滤镜通常会一起应用。实现可能会检测到这一点,并在一次传递中计算两个贴图,而不是两次。

属性定义:

surfaceScale = "<number>"

当 Ain = 1 时,表面的高度。

surfaceScale初始值1

可动画: 是。

specularConstant = "<number>"

Phong 光照模型中的 ks。 在 SVG 中,这可以是任何非负数。

specularConstant初始值1

可动画: 是。

specularExponent = "<number>"

镜面反射项的指数,值越大越“闪亮”。

specularExponent初始值1

可动画: 是。

kernelUnitLength = "<number-optional-number>"

第一个数值是 <dx> 值。第二个数值是 <dy> 值。

如果未指定 <dy> 值,则默认为与 <dx> 相同。指示在当前滤镜单位中的预期距离(即由属性 primitiveUnits 的值决定的单位)分别用于 dxdy,用于表面法线计算公式

通过为 kernelUnitLength 指定值,内核可以在可伸缩的抽象坐标系中定义。

如果未指定 kernelUnitLength,则 dxdy 值应表示相对于给定 (x,y) 位置的非常小的增量,这在某些情况下可能实现为中间图像的离屏位图中的一个像素,这是一个基于像素的坐标系,因此可能不可缩放。为了在显示媒体和用户代理之间达到某种程度的一致性,必须为 kernelUnitLength 提供一个值。

可动画: 是。

光源由以下子元素之一定义:feDistantLightfePointLightfeSpotLight。光的颜色由属性 lighting-color 指定。

本章开头的示例使用 feSpecularLighting 滤镜基元来实现高度反射的 3D 发光效果。

9.20. 滤镜基元 feTile

名称: feTile
类别: 滤镜基元
内容模型: 任意数量的描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFETileElement

该滤镜基元使用输入图像的重复平铺模式填充目标矩形。目标矩形与 滤镜基元子区域一样大,由 feTile 元素定义。

通常,输入图像已经通过其自身的 滤镜基元子区域定义了一个参考平铺。 feTile 在 X 和 Y 方向复制参考平铺以完全填充目标矩形。每个平铺的左上角位置为 (x + i*width, y + j*height),其中 (x,y) 表示输入图像的 滤镜基元子区域的左上角位置, widthheight 表示输入图像的 滤镜基元子区域 的宽度和高度, ij 可以是任意整数值。在大多数情况下,输入图像的 滤镜基元子区域 小于 feTile,以实现重复的图案效果。

实现者在构建平铺图像时必须采取适当的措施以避免平铺之间的伪影,尤其是在用户到设备变换包含剪切和/或旋转的情况下。除非采取适当的措施,否则插值可能导致平铺中的边缘像素的透明度值低于或高于预期,因为相邻平铺的绘制每个部分与特定像素部分重叠。

9.21. 滤镜基元 feTurbulence

名称: feTurbulence
类别: 滤镜基元
内容模型: 任何数量的 描述性元素, animate, script, set 元素,顺序不定。
属性:
DOM 接口: SVGFETurbulenceElement

该滤镜基元使用柏林噪声函数生成图像,可以合成诸如云层或大理石等人工纹理。关于柏林噪声函数的详细描述,请参阅“Texturing and Modeling” [TaM]。生成的图像将填充此滤镜基元的整个 滤镜基元子区域

通过仅合成一个倍频可以创建带宽受限的噪声。

下面的 C 代码展示了用于该滤镜效果的确切算法。滤镜基元子区域作为参数传递给 fTileX、fTileY、fTileWidth 和 fTileHeight。

对于 fractalSum,您会得到一个 turbFunctionResult,其目标范围为 -1 到 1(在某些情况下,实际结果可能超出此范围)。要转换为颜色或 alpha 值,请使用公式 colorValue = (turbFunctionResult + 1) / 2,然后将其限制在 0 到 1 的范围内。

对于 turbulence,您会得到一个 turbFunctionResult,其目标范围为 0 到 1(在某些情况下,实际结果可能超出此范围)。要转换为颜色或 alpha 值,请使用公式 colorValue = turbFunctionResult,然后将其限制在 0 到 1 的范围内。

以下顺序用于应用伪随机数。首先根据 seed 属性计算初始种子值。然后实现计算 R 的格点,继续获取相对于最后生成的伪随机数的附加伪随机数,并计算 G 的格点,依次类推计算 B 和 A。

生成的颜色和 alpha 值位于由 color-interpolation-filters 属性确定的颜色空间内:

/* 生成的结果范围为 [1, 2**31 - 2]。
算法为:r = (a * r) mod m
其中 a = 16807 且 m = 2**31 - 1 = 2147483647
参见 [Park & Miller], CACM vol. 31 no. 10 p. 1195, 1988 年 10 月
测试:如果原始种子为 1,算法应在第 10,000 个生成的数时产生结果 1043618065。
*/
#define RAND_m 2147483647 /* 2**31 - 1 */
#define RAND_a 16807 /* 7**5; primitive root of m */
#define RAND_q 127773 /* m / a */
#define RAND_r 2836 /* m % a */
long setup_seed(long lSeed)
{
  if (lSeed <= 0) lSeed = -(lSeed % (RAND_m - 1)) + 1;
  if (lSeed > RAND_m - 1) lSeed = RAND_m - 1;
  return lSeed;
}
long random(long lSeed)
{
  long result;
  result = RAND_a * (lSeed % RAND_q) - RAND_r * (lSeed / RAND_q);
  if (result <= 0) result += RAND_m;
  return result;
}
#define BSize 0x100
#define BM 0xff
#define PerlinN 0x1000
#define NP 12 /* 2^PerlinN */
#define NM 0xfff
static uLatticeSelector[BSize + BSize + 2];
static double fGradient[4][BSize + BSize + 2][2];
struct StitchInfo
{
  int nWidth; // How much to subtract to wrap for stitching.
  int nHeight;
  int nWrapX; // Minimum value to wrap.
  int nWrapY;
};
static void init(long lSeed)
{
  double s;
  int i, j, k;
  lSeed = setup_seed(lSeed);
  for(k = 0; k < 4; k++)
  {
    for(i = 0; i < BSize; i++)
    {
      uLatticeSelector[i] = i;
      do {
         for (j = 0; j < 2; j++)
           fGradient[k][i][j] = (double)(((lSeed = random(lSeed)) % (BSize + BSize)) - BSize) / BSize;
      } while(fGradient[k][i][0] == 0 && fGradient[k][i][1] == 0);
      s = double(sqrt(fGradient[k][i][0] * fGradient[k][i][0] + fGradient[k][i][1] * fGradient[k][i][1]));
      if (s > 1) {
          i--; // discard the current random vector; try it again.
          continue;
      }
      fGradient[k][i][0] /= s;
      fGradient[k][i][1] /= s;
    }
  }
  while(--i)
  {
    k = uLatticeSelector[i];
    uLatticeSelector[i] = uLatticeSelector[j = (lSeed = random(lSeed)) % BSize];
    uLatticeSelector[j] = k;
  }
  for(i = 0; i < BSize + 2; i++)
  {
    uLatticeSelector[BSize + i] = uLatticeSelector[i];
    for(k = 0; k < 4; k++)
      for(j = 0; j < 2; j++)
        fGradient[k][BSize + i][j] = fGradient[k][i][j];
  }
}
#define s_curve(t) ( t * t * (3. - 2. * t) )
#define lerp(t, a, b) ( a + t * (b - a) )
double noise2(int nColorChannel, double vec[2], StitchInfo *pStitchInfo)
{
  int bx0, bx1, by0, by1, b00, b10, b01, b11;
  double rx0, rx1, ry0, ry1, *q, sx, sy, a, b, t, u, v;
  register i, j;
  t = vec[0] + PerlinN;
  bx0 = (int)t;
  bx1 = bx0+1;
  rx0 = t - (int)t;
  rx1 = rx0 - 1.0f;
  t = vec[1] + PerlinN;
  by0 = (int)t;
  by1 = by0+1;
  ry0 = t - (int)t;
  ry1 = ry0 - 1.0f;
  // 如果启用了拼接,则相应调整格点。 
  if(pStitchInfo != NULL)
  {
    if(bx0 >= pStitchInfo->nWrapX)
      bx0 -= pStitchInfo->nWidth;
    if(bx1 >= pStitchInfo->nWrapX)
      bx1 -= pStitchInfo->nWidth;
    if(by0 >= pStitchInfo->nWrapY)
      by0 -= pStitchInfo->nHeight;
    if(by1 >= pStitchInfo->nWrapY)
      by1 -= pStitchInfo->nHeight;
  }
  bx0 &= BM;
  bx1 &= BM;
  by0 &= BM;
  by1 &= BM;
  i = uLatticeSelector[bx0];
  j = uLatticeSelector[bx1];
  b00 = uLatticeSelector[i + by0];
  b10 = uLatticeSelector[j + by0];
  b01 = uLatticeSelector[i + by1];
  b11 = uLatticeSelector[j + by1];
  sx = double(s_curve(rx0));
  sy = double(s_curve(ry0));
  q = fGradient[nColorChannel][b00]; u = rx0 * q[0] + ry0 * q[1];
  q = fGradient[nColorChannel][b10]; v = rx1 * q[0] + ry0 * q[1];
  a = lerp(sx, u, v);
  q = fGradient[nColorChannel][b01]; u = rx0 * q[0] + ry1 * q[1];
  q = fGradient[nColorChannel][b11]; v = rx1 * q[0] + ry1 * q[1];
  b = lerp(sx, u, v);
  return lerp(sy, a, b);
}
double turbulence(int nColorChannel, double *point, double fBaseFreqX, double fBaseFreqY,
          int nNumOctaves, bool bFractalSum, bool bDoStitching,
          double fTileX, double fTileY, double fTileWidth, double fTileHeight)
{
  StitchInfo stitch;
  StitchInfo *pStitchInfo = NULL; // Not stitching when NULL.
  // 如果需要拼接,则调整基础频率。 
  if(bDoStitching)
  {
    // 拼接平铺的湍流时,必须调整频率 
    // 以确保图块边界连续。 
    if(fBaseFreqX != 0.0)
    {
      double fLoFreq = double(floor(fTileWidth * fBaseFreqX)) / fTileWidth;
      double fHiFreq = double(ceil(fTileWidth * fBaseFreqX)) / fTileWidth;
      if(fBaseFreqX / fLoFreq < fHiFreq / fBaseFreqX)
        fBaseFreqX = fLoFreq;
      else
        fBaseFreqX = fHiFreq;
    }
    if(fBaseFreqY != 0.0)
    {
      double fLoFreq = double(floor(fTileHeight * fBaseFreqY)) / fTileHeight;
      double fHiFreq = double(ceil(fTileHeight * fBaseFreqY)) / fTileHeight;
      if(fBaseFreqY / fLoFreq < fHiFreq / fBaseFreqY)
        fBaseFreqY = fLoFreq;
      else
        fBaseFreqY = fHiFreq;
    }
    // 设置初始拼接值。 
    pStitchInfo = &stitch;
    stitch.nWidth = int(fTileWidth * fBaseFreqX + 0.5f);
    stitch.nWrapX = fTileX * fBaseFreqX + PerlinN + stitch.nWidth;
    stitch.nHeight = int(fTileHeight * fBaseFreqY + 0.5f);
    stitch.nWrapY = fTileY * fBaseFreqY + PerlinN + stitch.nHeight;
  }
  double fSum = 0.0f;
  double vec[2];
  vec[0] = point[0] * fBaseFreqX;
  vec[1] = point[1] * fBaseFreqY;
  double ratio = 1;
  for(int nOctave = 0; nOctave < nNumOctaves; nOctave++)
  {
    if(bFractalSum)
      fSum += double(noise2(nColorChannel, vec, pStitchInfo) / ratio);
    else
      fSum += double(fabs(noise2(nColorChannel, vec, pStitchInfo)) / ratio);
    vec[0] *= 2;
    vec[1] *= 2;
    ratio *= 2;
    if(pStitchInfo != NULL)
    {
      // 更新拼接值。在乘法前减去 PerlinN,之后再加回来,简化为只减一次。 
      stitch.nWidth *= 2;
      stitch.nWrapX = 2 * stitch.nWrapX - PerlinN;
      stitch.nHeight *= 2;
      stitch.nWrapY = 2 * stitch.nWrapY - PerlinN;
    }
  }
  return fSum;
}

属性定义:

baseFrequency = "<number-optional-number>"

噪声函数的基础频率参数。如果提供了两个 <number>,第一个数字表示X方向的基础频率,第二个值表示Y方向的基础频率。如果只提供一个数字,则该值用于X和Y方向。

初始值baseFrequency0

负值是 不支持的

可动画:是。

numOctaves = "<integer>"

噪声函数的numOctaves参数。

初始值numOctaves1

负值是 不支持的

可动画:是。

注意: 每个额外八度对最终图像中的颜色和alpha值的贡献是前一个八度的一半。在某些情况下,额外八度的贡献可能小于给定颜色深度的颜色分辨率。用户代理可能会在处理期间根据支持的颜色深度限制numOctaves的指定值。(例如:对于每通道8位的颜色深度,用户代理可能将numOctaves值限制为9。)

seed = "<number>"

伪随机数生成器的起始数字。

初始值seed0

将seed数字传递给上述算法时,必须首先截断,即四舍五入到最接近的整数值(向零取整)。

可动画:是。

stitchTiles = "stitch | noStitch"

如果stitchTiles="noStitch",则不尝试在包含湍流函数的图块边界处实现平滑过渡。有时结果会在图块边界处显示明显的不连续性。

如果stitchTiles="stitch",则用户代理将自动调整baseFrequency-x和baseFrequency-y值,使feTurbulence节点的宽度和高度(即当前子区域的宽度和高度)包含第一个八度的Perlin图块宽度和高度的整数倍。基础频率将根据相对(而非绝对)变化最小的方式进行调整:

初始值stitchTilesnoStitch

可动画:是。

type = "fractalNoise | turbulence"

指示滤镜原语应执行噪声或湍流函数。

初始值typeturbulence

可动画:是。

<svg width="450px" height="325px" viewBox="0 0 450 325"
     xmlns="http://www.w3.org/2000/svg">
  <title>Example feTurbulence - Examples of feTurbulence operations</title>
  <desc>六个矩形区域展示了feTurbulence各种参数设置的效果。</desc>
  <g  font-family="Verdana" text-anchor="middle" font-size="10"> 
    <defs>
      <filter id="Turb1" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="2"/>
      </filter>
      <filter id="Turb2" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.1" numOctaves="2"/>
      </filter>
      <filter id="Turb3" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="turbulence" baseFrequency="0.05" numOctaves="8"/>
      </filter>
      <filter id="Turb4" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="4"/>
      </filter>
      <filter id="Turb5" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.4" numOctaves="4"/>
      </filter>
      <filter id="Turb6" filterUnits="objectBoundingBox"
              x="0%" y="0%" width="100%" height="100%">
        <feTurbulence type="fractalNoise" baseFrequency="0.1" numOctaves="1"/>
      </filter>
    </defs>

    <rect x="1" y="1" width="448" height="323"
          fill="none" stroke="blue" stroke-width="1"  />

    <rect x="25" y="25" width="100" height="75" filter="url(#Turb1)"  />
    <text x="75" y="117">type=turbulence</text>
    <text x="75" y="129">baseFrequency=0.05</text>
    <text x="75" y="141">numOctaves=2</text>

    <rect x="175" y="25" width="100" height="75" filter="url(#Turb2)"  />
    <text x="225" y="117">type=turbulence</text>
    <text x="225" y="129">baseFrequency=0.1</text>
    <text x="225" y="141">numOctaves=2</text>

    <rect x="325" y="25" width="100" height="75" filter="url(#Turb3)"  />
    <text x="375" y="117">type=turbulence</text>
    <text x="375" y="129">baseFrequency=0.05</text>
    <text x="375" y="141">numOctaves=8</text>

    <rect x="25" y="180" width="100" height="75" filter="url(#Turb4)"  />
    <text x="75" y="272">type=fractalNoise</text>
    <text x="75" y="284">baseFrequency=0.1</text>
    <text x="75" y="296">numOctaves=4</text>

    <rect x="175" y="180" width="100" height="75" filter="url(#Turb5)"  />
    <text x="225" y="272">type=fractalNoise</text>
    <text x="225" y="284">baseFrequency=0.4</text>
    <text x="225" y="296">numOctaves=4</text>

    <rect x="325" y="180" width="100" height="75" filter="url(#Turb6)"  />
    <text x="375" y="272">type=fractalNoise</text>
    <text x="375" y="284">baseFrequency=0.1</text>
    <text x="375" y="296">numOctaves=1</text>
  </g>
</svg>
feTurbulence示例

feTurbulence示例

以SVG格式查看此示例

10. color-interpolation-filters 属性

关于 color-interpolation-filters 属性的描述如下:

名称: color-interpolation-filters
值: auto | sRGB | linearRGB
初始值: linearRGB
应用于: 所有 filter primitive
是否继承:
百分比: n/a
计算值: 按指定值
标准顺序: 符合语法
媒体: 视觉
可动画:
auto

表示用户代理可以在 sRGBlinearRGB 颜色空间中选择过滤效果的颜色操作。这个选项表明作者不要求颜色操作必须在特定颜色空间中进行。

sRGB

表示过滤效果的颜色操作应在sRGB颜色空间中进行。

linearRGB

表示过滤效果的颜色操作应在线性RGB颜色空间中进行。

color-interpolation-filters 属性指定通过过滤效果进行成像操作时所用的颜色空间。

注意: color-interpolation-filters 属性仅影响过滤操作。因此,它对诸如 feOffsetfeImagefeTilefeFlood 等过滤基元没有影响。

注意: color-interpolation-filters 的初始值不同于 color-interpolationcolor-interpolation-filters 的初始值为 linearRGB,而 color-interpolation 的初始值为 sRGB。因此,在默认情况下,过滤效果操作发生在linearRGB颜色空间,而所有其他颜色插值操作默认发生在sRGB颜色空间。

注意: color-interpolation-filters 属性不影响 Filter Functions,它们在sRGB颜色空间中操作。

color-interpolation-filters 属性是SVG元素的 表现属性

11. 光源元素和属性

11.1. 简介

以下部分定义了用于定义 光源 的元素,如 feDistantLightfePointLightfeSpotLight,以及定义光颜色的属性 lighting-color

11.2. 光源 feDistantLight

名称: feDistantLight
类别: 光源
内容模型: 任何数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEDistantLightElement

属性定义:

azimuth = "<number>"

光源在XY平面上的方向角(顺时针),以与x轴的角度表示,单位为度。

azimuth 的初始值为 0

可动画:是。

elevation = "<number>"

光源从XY平面向Z轴方向的角度,单位为度。请注意,正Z轴指向观众。

elevation 的初始值为 0

可动画:是。

下图说明了在XYZ坐标系中 azimuthelevation 所表示的角度。

方位角和仰角所代表的角度

方位角和仰角所代表的角度

11.3. 光源 fePointLight

名称: fePointLight
类别: 光源
内容模型: 任何数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFEPointLightElement

属性定义:

x = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的X位置,定义于 filter 元素。

x 的初始值为 0

可动画:是。

y = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的Y位置,定义于 filter 元素。

y 的初始值为 0

可动画:是。

z = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的Z位置,假定在初始 本地坐标系 中,正Z轴指向观察内容的人,并且假定Z轴上的一个单位等于 X和Y上的一个单位

z 的初始值为 0

可动画:是。

11.4. 光源 feSpotLight

名称: feSpotLight
类别: 光源
内容模型: 任何数量的 描述性元素animatescriptset 元素,顺序不限。
属性:
DOM 接口: SVGFESpotLightElement

属性定义:

x = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的X位置,定义于 filter 元素。

x 的初始值为 0

可动画:是。

y = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的Y位置,定义于 filter 元素。

y 的初始值为 0

可动画:是。

z = "<number>"

光源在由 primitiveUnits 属性确定的坐标系中的Z位置,假定在初始 本地坐标系 中,正Z轴指向观察内容的人,并且假定Z轴上的一个单位等于 X和Y上的一个单位

z 的初始值为 0

可动画:是。

pointsAtX = "<number>"

光源指向的点在由 primitiveUnits 属性确定的坐标系中的X位置,定义于 filter 元素。

pointsAtX 的初始值为 0

可动画:是。

pointsAtY = "<number>"

光源指向的点在由 primitiveUnits 属性确定的坐标系中的Y位置,定义于 filter 元素。

pointsAtY 的初始值为 0

可动画:是。

pointsAtZ = "<number>"

光源指向的点在由 primitiveUnits 属性确定的坐标系中的Z位置,假定在初始 本地坐标系 中,正Z轴指向观察内容的人,并且假定Z轴上的一个单位等于 X和Y上的一个单位

pointsAtZ 的初始值为 0

可动画:是。

specularExponent = "<number>"

控制光源焦点的指数值。

specularExponent 的初始值为 1

关于如何使用 specularExponent,参见 滤镜元素 <feDiffuseLighting>

注意: specularExponent 对于 feSpotLightfeSpecularLighting 中的 feSpecularLighting 用途不同。

可动画:是。

limitingConeAngle = "<number>"

限制光源投射区域的锥形限制器。锥形以外的区域不会投射光线。limitingConeAngle 代表聚光灯轴(即光源与其指向的点之间的轴线)与聚光灯锥之间的角度,单位为度。用户代理应该在锥体边界处应用平滑技术,例如抗锯齿。

如果未指定值,则不会应用锥形限制。

可动画:是。

11.5. 照明颜色 lighting-color 属性

名称: lighting-color
值: <color>
初始值: white
适用于: feDiffuseLightingfeSpecularLighting 元素
是否继承: no
百分比: n/a
计算值: 如指定
语法顺序: 按语法
媒体类型: 视觉
是否可动画: 计算值 动画

lighting-color 属性定义了过滤器原语 feDiffuseLightingfeSpecularLighting 元素的光源颜色。

lighting-color 属性是 SVG 元素的表现属性

12. 过滤器 CSS <image>

CSS <image> 值可以通过指定的过滤器函数进行过滤,这些函数是为 CSS filter 属性定义的。本规范引入了 <image> <filter()> 函数,其语法如下:

filter() = filter( [ <image> | <string> ], <filter-value-list> )

<filter()> 函数接受两个参数。第一个参数是 <image>。第二个参数是一个过滤器函数列表,正如为 CSS filter 属性所指定的那样。该函数接受 <image> 参数并应用过滤器规则,返回一个处理后的图像。过滤器和过滤效果区域的大小是根据输入 <image>具体对象大小 来确定的。

注意: 由于必须保留原始图像的尺寸和起点,因此一些过滤器效果(如在完全不透明的图像上使用 <drop-shadow()>)可能没有任何效果。

对于 <blur()> 函数,edgeMode 属性在 feGaussianBlur 元素上设置为 duplicate。这会在过滤输入图像的边缘产生更好的效果。

12.1. 插值 filter()

如果起始图像和结束图像都是 <filter()> 函数,它们可能仅通过所使用的过滤器函数有所不同,则必须通过插值其过滤器函数列表来插值,如 过滤器的插值 一节中所述。否则,它们必须作为一般的<image> 进行插值。如果无法执行过滤器函数插值,则必须将图像作为通用的 <image> 进行插值。

13. filter 元素定义的简写

13.1. 过滤器原语表示

下面是每个过滤器函数以 'filter 元素' 形式表示的等效项。函数中的参数用以下样式的括号标记:[amount]。对于百分比值的参数,它们会转换为实数。

13.1.1. grayscale

<filter id="grayscale">
  <feColorMatrix type="matrix"
             values="
    (0.2126 + 0.7874 * [1 - amount]) (0.7152 - 0.7152  * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0
    (0.2126 - 0.2126 * [1 - amount]) (0.7152 + 0.2848  * [1 - amount]) (0.0722 - 0.0722 * [1 - amount]) 0 0
    (0.2126 - 0.2126 * [1 - amount]) (0.7152 - 0.7152  * [1 - amount]) (0.0722 + 0.9278 * [1 - amount]) 0 0
    0 0 0 1 0"/>
</filter>

13.1.2. sepia

<filter id="sepia">
  <feColorMatrix type="matrix"
             values="
    (0.393 + 0.607 * [1 - amount]) (0.769 - 0.769 * [1 - amount]) (0.189 - 0.189 * [1 - amount]) 0 0
    (0.349 - 0.349 * [1 - amount]) (0.686 + 0.314 * [1 - amount]) (0.168 - 0.168 * [1 - amount]) 0 0
    (0.272 - 0.272 * [1 - amount]) (0.534 - 0.534 * [1 - amount]) (0.131 + 0.869 * [1 - amount]) 0 0
    0 0 0 1 0"/>
</filter>

13.1.3. saturate

<filter id="saturate">
  <feColorMatrix type="saturate" values="[amount]"/>
</filter>

13.1.4. hue-rotate

<filter id="hue-rotate">
  <feColorMatrix type="hueRotate" values="[angle]"/>
</filter>

13.1.5. invert

<filter id="invert">
  <feComponentTransfer>
      <feFuncR type="table" tableValues="[amount] (1 - [amount])"/>
      <feFuncG type="table" tableValues="[amount] (1 - [amount])"/>
      <feFuncB type="table" tableValues="[amount] (1 - [amount])"/>
  </feComponentTransfer>
</filter>

13.1.6. opacity

<filter id="opacity">
  <feComponentTransfer>
      <feFuncA type="table" tableValues="0 [amount]"/>
  </feComponentTransfer>
</filter>

13.1.7. brightness

<filter id="brightness">
  <feComponentTransfer>
      <feFuncR type="linear" slope="[amount]"/>
      <feFuncG type="linear" slope="[amount]"/>
      <feFuncB type="linear" slope="[amount]"/>
  </feComponentTransfer>
</filter>

13.1.8. contrast

<filter id="contrast">
  <feComponentTransfer>
      <feFuncR type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncG type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
      <feFuncB type="linear" slope="[amount]" intercept="-(0.5 * [amount]) + 0.5"/>
  </feComponentTransfer>
</filter>

13.1.9. blur

<filter id="blur">
  <feGaussianBlur stdDeviation="[radius radius]" edgeMode="[edge mode]">
</filter>

其中,edge mode 对 filter 属性计算为 none,对于 CSS Image 的 <filter()> 函数则计算为 duplicate

注意: <blur()> 函数可能会增加 UA 定义的过滤区域。请参见 简写的过滤区域

13.1.10. drop-shadow

<filter id="drop-shadow">
  <feGaussianBlur in="[alpha-channel-of-input]" stdDeviation="[radius]"/>
  <feOffset dx="[offset-x]" dy="[offset-y]" result="offsetblur"/>
  <feFlood flood-color="[color]"/>
  <feComposite in2="offsetblur" operator="in"/>
  <feMerge>
    <feMergeNode/>
    <feMergeNode in="[input-image]"/>
  </feMerge>
</filter>

注意: <drop-shadow()> 函数可能会增加 UA 定义的过滤区域。请参见 简写的过滤区域

13.2. 简写的过滤区域

前一小节中使用过滤原语实现的所有简写过滤器,必须具有用户代理定义的过滤区域。过滤区域必须覆盖元素的可视内容,包括溢出内容、图形控件元素(如滚动条)、border/border-imagebox-shadowtext-shadowoutline。此外,如果简写过滤器扩大了这个可见区域,比如 <blur()><drop-shadow()> 的情况,过滤区域也必须覆盖这些区域。

注意:有关 过滤源 的处理,请参见 过滤区域 部分。

14. 过滤器的动画

14.1. 过滤函数列表的插值

对于从一个过滤器到第二个过滤器的插值,必须运行以下列表中与第一个匹配条件相对应的步骤:

如果两个过滤器都有相同长度的<filter-value-list>,且没有 <url>,并且每个<filter-function>在每个列表中都有相应项
根据过滤函数的插值部分的规则,插值每对<filter-function>
如果两个过滤器都有不同长度的<filter-value-list>,且没有<url>,并且每个<filter-function>在每个列表中都有相应项
  1. 将缺失的<filter-function>等效项从较长的列表末尾附加到较短的列表中。新添加的<filter-function>必须初始化为插值的初始值。
  2. 根据过滤函数的插值部分的规则,插值每对<filter-function>
如果一个过滤器为 none,另一个为没有 <url><filter-value-list>
  1. none 替换为另一个过滤器的对应 <filter-value-list>。新的<filter-function>必须初始化为插值的初始值。
  2. 根据过滤函数的插值部分的规则,插值每对<filter-function>
否则
使用离散插值。

计算过滤函数的距离。<https://github.com/w3c/csswg-drafts/issues/91>

14.2. 加法

可以组合独立的 <filter-value-list> 动画 [SVG11]

给定两个表示基值 (base filter list) 和要添加的值 (added filter list) 的过滤器值,返回两个列表的连接结果:‘base filter list added filter list’。

以下 SVG 动画有两个 animate 元素,它们对 filter 属性进行了动画处理。两个指定的动画都是加法动画,持续时间为 10s
<rect width="200px" filter="none" ...>
  <animate attributeName="filter" from="blur(0px)" to="blur(10px)" dur="10s"
           additive="sum"/>
  <animate attributeName="filter" from="sepia(0)" to="sepia(1)" dur="10s"
           additive="sum"/>
</rect>

5s 后,已用值blur(5px) sepia(0.5)

14.3. 累积

给定两个过滤器值 VaVb,返回过滤器值 Vb

15. 隐私和安全考量

15.1. 污染的过滤原语

重要的是,任何过滤操作的时间必须与从过滤内容或其他可能包含隐私敏感信息的来源获得的像素值无关。

以下过滤原语可能会访问包含隐私敏感信息的像素值,无论是来自过滤对象本身,还是来自如 CSS 样式的其他来源。这些原语必须被标记为“污染”。

  1. feFlood指定值flood-color 属性计算为 currentColor 时,

  2. feDropShadow指定值flood-color 属性计算为 currentColor 时,

  3. feDiffuseLighting,当 指定值lighting-color 属性计算为 currentColor 时,

  4. feSpecularLighting指定值lighting-color 属性计算为 currentColor 时,

  5. feImage,当 <url> 引用指向元素或使用 No-CORS 模式获取资源时,

  6. 以下过滤原语:SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint

feFloodfeDropShadowfeDiffuseLightingfeSpecularLighting 是具有一个或多个 CSS 属性的原语,这些属性将 <color> 作为属性值。 <color> 包含(其中之一)currentColor 关键字。currentColor已用值 源自 color 属性。由于 color 可以通过 :visited 伪类选择器进行设置,它可能包含隐私敏感信息,因此这些原语必须被标记为污染。

feImage 可以引用跨域图像以及文档片段,例如 SVG 图形元素。这些引用可能包含隐私敏感信息,因此该原语必须被标记为污染。

过滤原语 SourceGraphicSourceAlphaBackgroundImageBackgroundAlphaFillPaintStrokePaint 参考了文档片段,例如 SVG 图形元素,或样式信息可能直接或间接来自 color 属性。因此这些原语必须被标记为污染。

每个 过滤原语,如果其输入为“污染”标记的过滤原语,则必须也被标记为“污染”。

过滤操作的实现必须保证无论输入的像素值如何,它们始终花费相同的时间处理,如果输入的过滤原语之一被标记为“污染”。

注意: 本规范根据用户代理反馈,加大了对过滤原语的限制。

15.2. feDisplacementMap 限制

如果 feDisplacementMap 的输入是被标记为“污染”的过滤原语,并且此输入过滤原语作为位移图使用(由 in2 引用),则 feDisplacementMap 不应继续过滤操作,并且作为 直通过滤器 行为。

15.3. 来源限制

用户代理必须使用由 可能启用 CORS 的获取 方法,该方法由 [HTML5] 规范定义,用于 filter 属性。在获取时,用户代理必须使用“匿名”模式,将引用源设置为样式表的 URL,并将来源设置为包含文档的 URL。如果这导致网络错误,则效果如同指定了值 none 一样。

15.4. 时间攻击

如果未遵循上述规则,攻击者可能会推断信息并发起时间攻击。

时间攻击是一种基于研究某操作发生所需时间的长短,从而获取原本受到保护的内容信息的方法。例如,如果绘制红色像素比绘制绿色像素花费的时间更长,则可以在从未访问元素内容的情况下,粗略地重建元素正在渲染的图像。安全性研究表明,硬件架构或编译器可能会导致算术操作上的时间差异 [ArTD]

附录 A:已弃用的 enable-background 属性

SVG 1.1 引入了 enable-background 属性 [SVG11]。该属性定义了在调用 过滤区域filter 元素下的背景。根据编写本规范时的 CSS 堆叠上下文模型,发现该属性定义的概念与之不兼容。用户代理可以选择按照 SVG 1.1 的定义实现 enable-background 属性,但这将与本规范或 CSS 组合与混合 [COMPOSITING-1] 不兼容。

本规范不支持 enable-background 属性。用户代理必须支持 isolation 属性代替 [COMPOSITING-1]

附录 B: DOM 接口

接口 SVGFilterElement

SVGFilterElement 接口对应于 filter 元素。

interface SVGFilterElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration filterUnits;
  readonly attribute SVGAnimatedEnumeration primitiveUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

SVGFilterElement includes SVGURIReference;
属性:
filterUnits, 类型为 SVGAnimatedEnumeration, 只读

对应于 filterUnits 属性。取值为 SVGUnitTypes 中定义的常量之一。

primitiveUnits, 类型为 SVGAnimatedEnumeration, 只读

对应于 primitiveUnits 属性。取值为 SVGUnitTypes 中定义的常量之一。

x, 类型为 SVGAnimatedLength,只读

对应于 x 属性。

y, 类型为 SVGAnimatedLength,只读

对应于 y 属性。

width, 类型为 SVGAnimatedLength,只读

对应于 width 属性。

height, 类型为 SVGAnimatedLength,只读

对应于 height 属性。

接口 SVGFilterPrimitiveStandardAttributes

interface mixin SVGFilterPrimitiveStandardAttributes {
readonly attribute SVGAnimatedLength x;
readonly attribute SVGAnimatedLength y;
readonly attribute SVGAnimatedLength width;
readonly attribute SVGAnimatedLength height;
readonly attribute SVGAnimatedString result;
};
属性:
x, 类型为 SVGAnimatedLength,只读

对应于 x 属性。

y, 类型为 SVGAnimatedLength,只读

对应于 y 属性。

width, 类型为 SVGAnimatedLength,只读

对应于 width 属性。

height, 类型为 SVGAnimatedLength,只读

对应于 height 属性。

result, 类型为 SVGAnimatedString,只读

对应于 result 属性。

接口 SVGFEBlendElement

SVGFEBlendElement 接口对应于 feBlend 元素。

interface SVGFEBlendElement : SVGElement {

  // 混合模式类型
  const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0;
  const unsigned short SVG_FEBLEND_MODE_NORMAL = 1;
  const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2;
  const unsigned short SVG_FEBLEND_MODE_SCREEN = 3;
  const unsigned short SVG_FEBLEND_MODE_DARKEN = 4;
  const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5;
  const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6;
  const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7;
  const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8;
  const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9;
  const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10;
  const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11;
  const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12;
  const unsigned short SVG_FEBLEND_MODE_HUE = 13;
  const unsigned short SVG_FEBLEND_MODE_SATURATION = 14;
  const unsigned short SVG_FEBLEND_MODE_COLOR = 15;
  const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration mode;
};

SVGFEBlendElement includes SVGFilterPrimitiveStandardAttributes;
常量组 "Blend Mode Types" 中的常量:
SVG_FEBLEND_MODE_UNKNOWN

此类型不是预定义类型之一。尝试定义此类型的新值或尝试将现有值切换为此类型是无效的。

SVG_FEBLEND_MODE_NORMAL

对应于值 normal

SVG_FEBLEND_MODE_MULTIPLY

对应于值 multiply

SVG_FEBLEND_MODE_SCREEN

对应于值 screen

SVG_FEBLEND_MODE_DARKEN

对应于值 darken

SVG_FEBLEND_MODE_LIGHTEN

对应于值 lighten

SVG_FEBLEND_MODE_OVERLAY

对应于值 overlay

SVG_FEBLEND_MODE_COLOR_DODGE

对应于值 color-dodge

SVG_FEBLEND_MODE_COLOR_BURN

对应于值 color-burn

SVG_FEBLEND_MODE_HARD_LIGHT

对应于值 hard-light

SVG_FEBLEND_MODE_SOFT_LIGHT

对应于值 soft-light

SVG_FEBLEND_MODE_DIFFERENCE

对应于值 difference

SVG_FEBLEND_MODE_EXCLUSION

对应于值 exclusion

SVG_FEBLEND_MODE_HUE

对应于值 hue

SVG_FEBLEND_MODE_SATURATION

对应于值 saturation

SVG_FEBLEND_MODE_COLOR

对应于值 color

SVG_FEBLEND_MODE_LUMINOSITY

对应于值 luminosity

属性:
in1, 类型为 SVGAnimatedString,只读

对应于属性 in 在给定的 feBlend 元素上。

in2, 类型为 SVGAnimatedString,只读

对应于属性 in2 在给定的 feBlend 元素上。

mode, 类型为 SVGAnimatedEnumeration, 只读

对应于属性 mode 在给定的 feBlend 元素上。取值为此接口上定义的 SVG_FEBLEND_MODE_* 常量之一。

接口 SVGFEColorMatrixElement

SVGFEColorMatrixElement接口对应于feColorMatrix元素。

interface SVGFEColorMatrixElement : SVGElement {

  // 颜色矩阵类型
  const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList values;
};

SVGFEColorMatrixElement includes SVGFilterPrimitiveStandardAttributes;
组内常量“颜色矩阵类型”:
SVG_FECOLORMATRIX_TYPE_UNKNOWN

类型不是预定义类型之一。试图定义此类型的新值或将现有值切换为此类型是无效的。

SVG_FECOLORMATRIX_TYPE_MATRIX

对应于值matrix

SVG_FECOLORMATRIX_TYPE_SATURATE

对应于值saturate

SVG_FECOLORMATRIX_TYPE_HUEROTATE

对应于值hueRotate

SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA

对应于值luminanceToAlpha

属性:
in1, 类型为SVGAnimatedString,只读

对应于属性in,该属性属于给定的feColorMatrix元素。

type, 类型为SVGAnimatedEnumeration,只读

对应于属性type,该属性属于给定的feColorMatrix元素。取值为此接口上定义的SVG_FECOLORMATRIX_TYPE_*常量之一。

values, 类型为SVGAnimatedNumberList,只读

对应于属性values,该属性属于给定的feColorMatrix元素。

接口 SVGFEComponentTransferElement

SVGFEComponentTransferElement接口对应于feComponentTransfer元素。

interface SVGFEComponentTransferElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFEComponentTransferElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为SVGAnimatedString,只读

对应于属性in,该属性属于给定的feComponentTransfer元素。

接口 SVGComponentTransferFunctionElement

此接口定义了组件转换功能接口使用的基础接口。

interface SVGComponentTransferFunctionElement : SVGElement {

  // 组件转换类型
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;

  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList tableValues;
  readonly attribute SVGAnimatedNumber slope;
  readonly attribute SVGAnimatedNumber intercept;
  readonly attribute SVGAnimatedNumber amplitude;
  readonly attribute SVGAnimatedNumber exponent;
  readonly attribute SVGAnimatedNumber offset;
};
常量组“组件转换类型”:
SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN

该类型不是预定义的类型之一。尝试定义该类型的新值或尝试将现有值切换为此类型是无效的。

SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY

对应值identity

SVG_FECOMPONENTTRANSFER_TYPE_TABLE

对应值table

SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE

对应值discrete

SVG_FECOMPONENTTRANSFER_TYPE_LINEAR

对应值linear

SVG_FECOMPONENTTRANSFER_TYPE_GAMMA

对应值gamma

属性:
type, 类型为SVGAnimatedEnumeration,只读

对应于给定的feComponentTransfer元素上的属性in。取此接口上定义的 SVG_FECOMPONENTTRANSFER_TYPE_* 常量之一。

tableValues, 类型为SVGAnimatedNumberList,只读

对应于给定的feComponentTransfer元素上的属性tableValues

slope, 类型为SVGAnimatedNumber,只读

对应于给定的feComponentTransfer元素上的属性slope

intercept, 类型为SVGAnimatedNumber,只读

对应于给定的feComponentTransfer元素上的属性intercept

amplitude, 类型为SVGAnimatedNumber,只读

对应于给定的feComponentTransfer元素上的属性amplitude

exponent, 类型为SVGAnimatedNumber,只读

对应于给定的feComponentTransfer元素上的属性exponent

offset, 类型为SVGAnimatedNumber,只读

对应于给定的feComponentTransfer元素上的属性offset

接口 SVGFEFuncRElement

SVGFEFuncRElement接口对应于feFuncR元素。

interface SVGFEFuncRElement : SVGComponentTransferFunctionElement {
};

接口 SVGFEFuncGElement

SVGFEFuncGElement接口对应于feFuncG元素。

interface SVGFEFuncGElement : SVGComponentTransferFunctionElement {
};

接口 SVGFEFuncBElement

SVGFEFuncBElement接口对应于feFuncB元素。

interface SVGFEFuncBElement : SVGComponentTransferFunctionElement {
};

接口 SVGFEFuncAElement

SVGFEFuncAElement接口对应于feFuncA元素。

interface SVGFEFuncAElement : SVGComponentTransferFunctionElement {
};

接口 SVGFECompositeElement

SVGFECompositeElement接口对应于feComposite元素。

interface SVGFECompositeElement : SVGElement {

  // 复合操作符
  const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber k1;
  readonly attribute SVGAnimatedNumber k2;
  readonly attribute SVGAnimatedNumber k3;
  readonly attribute SVGAnimatedNumber k4;
};

SVGFECompositeElement includes SVGFilterPrimitiveStandardAttributes;
组合操作符组中的常量:
SVG_FECOMPOSITE_OPERATOR_UNKNOWN

该类型不是预定义类型之一。尝试定义新值或尝试将现有值切换为该类型是无效的。

SVG_FECOMPOSITE_OPERATOR_OVER

对应值为 over

SVG_FECOMPOSITE_OPERATOR_IN

对应值为 in

SVG_FECOMPOSITE_OPERATOR_OUT

对应值为 out

SVG_FECOMPOSITE_OPERATOR_ATOP

对应值为 atop

SVG_FECOMPOSITE_OPERATOR_XOR

对应值为 xor

SVG_FECOMPOSITE_OPERATOR_ARITHMETIC

对应值为 arithmetic

属性:
in1

对应 in 属性的值在 feComposite 元素中。

in2

对应 in2 属性的值在 feComposite 元素中。

operator

对应 operator 属性的值在 feComposite 元素中。接受此接口上定义的 SVG_FECOMPOSITE_OPERATOR_* 常量之一。

k1

对应 k1 属性的值在 feComposite 元素中。

k2

对应 k2 属性的值在 feComposite 元素中。

k3

对应 k3 属性的值在 feComposite 元素中。

k4

对应 k4 属性的值在 feComposite 元素中。

接口 SVGFEConvolveMatrixElement

SVGFEConvolveMatrixElement 接口对应于 feConvolveMatrix 元素。

interface SVGFEConvolveMatrixElement : SVGElement {

  // 边缘模式值
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedInteger orderX;
  readonly attribute SVGAnimatedInteger orderY;
  readonly attribute SVGAnimatedNumberList kernelMatrix;
  readonly attribute SVGAnimatedNumber divisor;
  readonly attribute SVGAnimatedNumber bias;
  readonly attribute SVGAnimatedInteger targetX;
  readonly attribute SVGAnimatedInteger targetY;
  readonly attribute SVGAnimatedEnumeration edgeMode;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
  readonly attribute SVGAnimatedBoolean preserveAlpha;
};

SVGFEConvolveMatrixElement includes SVGFilterPrimitiveStandardAttributes;
常量组“边缘模式值”中的常量:
SVG_EDGEMODE_UNKNOWN

该类型不是预定义的类型之一。尝试定义此类型的新值或尝试将现有值切换到此类型是无效的。

SVG_EDGEMODE_DUPLICATE

对应于值 duplicate

SVG_EDGEMODE_WRAP

对应于值 wrap

SVG_EDGEMODE_NONE

对应于值 none

属性:
in1, 类型为 SVGAnimatedString,只读

对应于给定元素上的属性 in

orderX, 类型为 SVGAnimatedInteger,只读

对应于给定元素上的属性 order

orderY, 类型为 SVGAnimatedInteger,只读

对应于给定元素上的属性 order

kernelMatrix, 类型为 SVGAnimatedNumberList,只读

对应于给定元素上的属性 kernelMatrix

divisor, 类型为 SVGAnimatedNumber,只读

对应于给定元素上的属性 divisor

bias, 类型为 SVGAnimatedNumber,只读

对应于给定元素上的属性 bias

targetX, 类型为 SVGAnimatedInteger,只读

对应于给定元素上的属性 targetX

targetY, 类型为 SVGAnimatedInteger,只读

对应于给定元素上的属性 targetY

edgeMode, 类型为 SVGAnimatedEnumeration,只读

对应于给定元素上的属性 edgeMode

kernelUnitLengthX, 类型为 SVGAnimatedNumber,只读

对应于给定元素上的属性 kernelUnitLength

kernelUnitLengthY, 类型为 SVGAnimatedNumber,只读

对应于给定元素上的属性 kernelUnitLength

preserveAlpha, 类型为 SVGAnimatedBoolean,只读

对应于给定元素上的属性 preserveAlpha

接口 SVGFEDiffuseLightingElement

SVGFEDiffuseLightingElement 接口对应于 feDiffuseLighting 元素。

interface SVGFEDiffuseLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber diffuseConstant;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFEDiffuseLightingElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为 SVGAnimatedString,只读

对应于给定 feDiffuseLighting 元素的属性 in

surfaceScale, 类型为 SVGAnimatedNumber,只读

对应于给定 feDiffuseLighting 元素的属性 surfaceScale

diffuseConstant, 类型为 SVGAnimatedNumber,只读

对应于给定 feDiffuseLighting 元素的属性 diffuseConstant

kernelUnitLengthX, 类型为 SVGAnimatedNumber,只读

对应于给定 feDiffuseLighting 元素的属性 kernelUnitLength

kernelUnitLengthY, 类型为 SVGAnimatedNumber,只读

对应于给定 feDiffuseLighting 元素的属性 kernelUnitLength

接口 SVGFEDistantLightElement

SVGFEDistantLightElement 接口对应于 feDistantLight 元素。

interface SVGFEDistantLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber azimuth;
  readonly attribute SVGAnimatedNumber elevation;
};
属性:
azimuth, 类型为 SVGAnimatedNumber,只读

对应于 azimuth 属性,位于给定的 feDistantLight 元素。

elevation, 类型为 SVGAnimatedNumber,只读

对应于 elevation 属性,位于给定的 feDistantLight 元素。

接口 SVGFEPointLightElement

SVGFEPointLightElement 接口对应于 fePointLight 元素。

interface SVGFEPointLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
};
属性:
x, 类型为 SVGAnimatedNumber,只读

对应于 x 属性,位于给定的 fePointLight 元素。

y, 类型为 SVGAnimatedNumber,只读

对应于 y 属性,位于给定的 fePointLight 元素。

z, 类型为 SVGAnimatedNumber,只读

对应于 z 属性,位于给定的 fePointLight 元素。

接口 SVGFESpotLightElement

SVGFESpotLightElement 接口对应于 feSpotLight 元素。

interface SVGFESpotLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
  readonly attribute SVGAnimatedNumber pointsAtX;
  readonly attribute SVGAnimatedNumber pointsAtY;
  readonly attribute SVGAnimatedNumber pointsAtZ;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber limitingConeAngle;
};
属性:
x, 类型为 SVGAnimatedNumber,只读

对应于 x 属性,位于给定的 feSpotLight 元素。

y, 类型为 SVGAnimatedNumber,只读

对应于 y 属性,位于给定的 feSpotLight 元素。

z, 类型为 SVGAnimatedNumber,只读

对应于 z 属性,位于给定的 feSpotLight 元素。

pointsAtX, 类型为 SVGAnimatedNumber,只读

对应于 pointsAtX 属性,位于给定的 feSpotLight 元素。

pointsAtY, 类型为 SVGAnimatedNumber,只读

对应于 pointsAtY 属性,位于给定的 feSpotLight 元素。

pointsAtZ, 类型为 SVGAnimatedNumber,只读

对应于 pointsAtZ 属性,位于给定的 feSpotLight 元素。

specularExponent 类型为 SVGAnimatedNumber,只读

对应于 specularExponent 属性,位于给定的 feSpotLight 元素。

limitingConeAngle 类型为 SVGAnimatedNumber,只读

对应于 limitingConeAngle 属性,位于给定的 feSpotLight 元素。

接口 SVGFEDisplacementMapElement

SVGFEDisplacementMapElement 接口对应于 feDisplacementMap 元素。

interface SVGFEDisplacementMapElement : SVGElement {

  // Channel Selectors
  const unsigned short SVG_CHANNEL_UNKNOWN = 0;
  const unsigned short SVG_CHANNEL_R = 1;
  const unsigned short SVG_CHANNEL_G = 2;
  const unsigned short SVG_CHANNEL_B = 3;
  const unsigned short SVG_CHANNEL_A = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedNumber scale;
  readonly attribute SVGAnimatedEnumeration xChannelSelector;
  readonly attribute SVGAnimatedEnumeration yChannelSelector;
};

SVGFEDisplacementMapElement includes SVGFilterPrimitiveStandardAttributes;
常量组“通道选择器”中的常量:
SVG_CHANNEL_UNKNOWN

该类型不是预定义的类型之一。尝试定义此类型的新值或将现有值切换到此类型是无效的。

SVG_CHANNEL_R

对应于值 R

SVG_CHANNEL_G

对应于值 G

SVG_CHANNEL_B

对应于值 B

SVG_CHANNEL_A

对应于值 A

属性:
in1, 类型为 SVGAnimatedString,只读

对应于给定 in 属性,位于 feDisplacementMap 元素上。

in2, 类型为 SVGAnimatedString,只读

对应于给定 in2 属性,位于 feDisplacementMap 元素上。

scale, 类型为 SVGAnimatedNumber,只读

对应于给定 scale 属性,位于 feDisplacementMap 元素上。

xChannelSelector, 类型为 SVGAnimatedEnumeration,只读

对应于给定 xChannelSelector 属性,位于 feDisplacementMap 元素上。取自此接口定义的 SVG_CHANNEL_* 常量之一。

yChannelSelector, 类型为 SVGAnimatedEnumeration,只读

对应于给定 yChannelSelector 属性,位于 feDisplacementMap 元素上。取自此接口定义的 SVG_CHANNEL_* 常量之一。

接口 SVGFEDropShadowElement

SVGFEDropShadowElement 接口对应于 feDropShadow 元素。

interface SVGFEDropShadowElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEDropShadowElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为 SVGAnimatedString,只读

对应于给定 in 属性,位于 feDropShadow 元素上。

dx, 类型为 SVGAnimatedNumber,只读

对应于给定 dx 属性,位于 feDropShadow 元素上。

dy, 类型为 SVGAnimatedNumber,只读

对应于给定 dy 属性,位于 feDropShadow 元素上。

stdDeviationX, 类型为 SVGAnimatedNumber,只读

对应于给定 stdDeviation 属性,包含 stdDeviation 的 X 分量。

stdDeviationY, 类型为 SVGAnimatedNumber,只读

对应于给定 stdDeviation 属性,包含 stdDeviation 的 Y 分量。

方法:
setStdDeviation(stdDeviationX, stdDeviationY)

设置 stdDeviation 属性的值。

stdDeviationX

X 分量对应于 stdDeviation 属性。

stdDeviationY

Y 分量对应于 stdDeviation 属性。

接口 SVGFEFloodElement

SVGFEFloodElement 接口对应于 feFlood 元素。

interface SVGFEFloodElement : SVGElement {
};

SVGFEFloodElement includes SVGFilterPrimitiveStandardAttributes;

接口 SVGFEGaussianBlurElement

SVGFEGaussianBlurElement 接口对应于 feGaussianBlur 元素。

interface SVGFEGaussianBlurElement : SVGElement {

  // 边缘模式值
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;
  readonly attribute SVGAnimatedEnumeration edgeMode;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEGaussianBlurElement includes SVGFilterPrimitiveStandardAttributes;
常量组 "边缘模式值":
SVG_EDGEMODE_UNKNOWN

该类型不是预定义类型之一。尝试定义该类型的新值或将现有值切换为该类型是无效的。

SVG_EDGEMODE_DUPLICATE

对应值 duplicate

SVG_EDGEMODE_WRAP

对应值 wrap

SVG_EDGEMODE_NONE

对应值 none

属性:
in1, 类型 SVGAnimatedString, 只读

对应于给定的 in 属性在元素 feGaussianBlur 上。

stdDeviationX, 类型 SVGAnimatedNumber, 只读

对应于 stdDeviation 属性的 X 组件在元素 feGaussianBlur 上。

stdDeviationY, 类型 SVGAnimatedNumber, 只读

对应于 stdDeviation 属性的 Y 组件在元素 feGaussianBlur 上。

edgeMode, 类型 SVGAnimatedEnumeration, 只读

对应于 edgeMode 属性在元素 feGaussianBlur 上。取自该接口上定义的 SVG_EDGEMODE_* 常量之一。

方法:
setStdDeviation(stdDeviationX, stdDeviationY)

stdDeviation 属性设置值。

stdDeviationX

stdDeviation 属性的 X 组件。

stdDeviationY

stdDeviation 属性的 Y 组件。

接口 SVGFEImageElement

SVGFEImageElement 接口对应于 feImage 元素。

interface SVGFEImageElement : SVGElement {
  readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
  readonly attribute SVGAnimatedString crossOrigin;
};

SVGFEImageElement includes SVGFilterPrimitiveStandardAttributes;
SVGFEImageElement includes SVGURIReference;
属性:
preserveAspectRatio 类型 SVGAnimatedPreserveAspectRatio, 只读

对应于给定的 preserveAspectRatio 属性在元素 feImage 上。

crossOrigin 类型 SVGAnimatedString, 只读

crossorigin 内容属性仅限已知值。

接口 SVGFEMergeElement

SVGFEMergeElement 接口对应于 feMerge 元素。

interface SVGFEMergeElement : SVGElement {
};

SVGFEMergeElement includes SVGFilterPrimitiveStandardAttributes;

接口 SVGFEMergeNodeElement

SVGFEMergeNodeElement 接口对应于 feMergeNode 元素。

interface SVGFEMergeNodeElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};
属性:
in1 类型 SVGAnimatedString, 只读

对应于给定的 in 属性在元素 feMergeNode 上。

接口 SVGFEMorphologyElement

SVGFEMorphologyElement 接口对应于 feMorphology 元素。

interface SVGFEMorphologyElement : SVGElement {

  // Morphology Operators
  const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber radiusX;
  readonly attribute SVGAnimatedNumber radiusY;
};

SVGFEMorphologyElement includes SVGFilterPrimitiveStandardAttributes;
“形态学运算符”组中的常量:
SVG_MORPHOLOGY_OPERATOR_UNKNOWN

该类型不是预定义类型之一。尝试定义此类型的新值或尝试将现有值切换为此类型都是无效的。

SVG_MORPHOLOGY_OPERATOR_ERODE

对应值为 erode

SVG_MORPHOLOGY_OPERATOR_DILATE

对应值为 dilate

属性:
in1, 类型为 SVGAnimatedString,只读

对应 in 属性,位于给定的 feMorphology 元素上。

operator, 类型为 SVGAnimatedEnumeration, 只读

对应 operator 属性,位于给定的 feMorphology 元素上。该属性接受此接口定义的 SVG_MORPHOLOGY_OPERATOR_* 常量之一。

radiusX, 类型为 SVGAnimatedNumber,只读

对应 radius 属性,位于给定的 feMorphology 元素上。包含 radius 属性的 X 组件。

radiusY, 类型为 SVGAnimatedNumber,只读

对应 radius 属性,位于给定的 feMorphology 元素上。包含 radius 属性的 Y 组件。

SVGFEOffsetElement 接口

SVGFEOffsetElement 接口对应 feOffset 元素。

interface SVGFEOffsetElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
};

SVGFEOffsetElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为 SVGAnimatedString,只读

对应 in 属性,位于给定的 feOffset 元素上。

dx, 类型为 SVGAnimatedNumber,只读

对应 dx 属性,位于给定的 feOffset 元素上。

dy, 类型为 SVGAnimatedNumber,只读

对应 dy 属性,位于给定的 feOffset 元素上。

SVGFESpecularLightingElement 接口

SVGFESpecularLightingElement 接口对应 feSpecularLighting 元素。

interface SVGFESpecularLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber specularConstant;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFESpecularLightingElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为 SVGAnimatedString,只读

对应 in 属性,位于给定的 feSpecularLighting 元素上。

surfaceScale, 类型为 SVGAnimatedNumber,只读

对应 surfaceScale 属性,位于给定的 feSpecularLighting 元素上。

specularConstant, 类型为 SVGAnimatedNumber,只读

对应 specularConstant 属性,位于给定的 feSpecularLighting 元素上。

specularExponent, 类型为 SVGAnimatedNumber,只读

对应 specularExponent 属性,位于给定的 feSpecularLighting 元素上。

kernelUnitLengthX, 类型为 SVGAnimatedNumber,只读

对应 kernelUnitLength 属性,位于给定的 feSpecularLighting 元素上。

kernelUnitLengthY, 类型为 SVGAnimatedNumber,只读

对应 kernelUnitLength 属性,位于给定的 feSpecularLighting 元素上。

SVGFETileElement 接口

SVGFETileElement 接口对应 feTile 元素。

interface SVGFETileElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFETileElement includes SVGFilterPrimitiveStandardAttributes;
属性:
in1, 类型为 SVGAnimatedString,只读

对应 in 属性,位于给定的 feTile 元素上。

SVGFETurbulenceElement 接口

SVGFETurbulenceElement 接口对应 feTurbulence 元素。

interface SVGFETurbulenceElement : SVGElement {

  // 湍流类型
  const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2;

  // 缝合选项
  const unsigned short SVG_STITCHTYPE_UNKNOWN = 0;
  const unsigned short SVG_STITCHTYPE_STITCH = 1;
  const unsigned short SVG_STITCHTYPE_NOSTITCH = 2;

  readonly attribute SVGAnimatedNumber baseFrequencyX;
  readonly attribute SVGAnimatedNumber baseFrequencyY;
  readonly attribute SVGAnimatedInteger numOctaves;
  readonly attribute SVGAnimatedNumber seed;
  readonly attribute SVGAnimatedEnumeration stitchTiles;
  readonly attribute SVGAnimatedEnumeration type;
};

SVGFETurbulenceElement includes SVGFilterPrimitiveStandardAttributes;
“湍流类型”组中的常量:
SVG_TURBULENCE_TYPE_UNKNOWN

该类型不是预定义类型之一。尝试定义此类型的新值或尝试将现有值切换为此类型都是无效的。

SVG_TURBULENCE_TYPE_FRACTALNOISE

对应值为 fractalNoise

SVG_TURBULENCE_TYPE_TURBULENCE

对应值为 turbulence

“缝合选项”组中的常量:
SVG_STITCHTYPE_UNKNOWN

该类型不是预定义类型之一。尝试定义此类型的新值或尝试将现有值切换为此类型都是无效的。

SVG_STITCHTYPE_STITCH

对应值为 stitch

SVG_STITCHTYPE_NOSTITCH

对应值为 noStitch

属性:
baseFrequencyX, 类型为 SVGAnimatedNumber,只读

对应 baseFrequency 属性,位于给定的 feTurbulence 元素上。包含 baseFrequency 属性的 X 组件。

baseFrequencyY, 类型为 SVGAnimatedNumber,只读

对应 baseFrequency 属性,位于给定的 feTurbulence 元素上。包含 baseFrequency 属性的 Y 组件。

numOctaves, 类型为 SVGAnimatedInteger,只读

对应 numOctaves 属性,位于给定的 feTurbulence 元素上。

seed, 类型为 SVGAnimatedNumber,只读

对应 seed 属性,位于给定的 feTurbulence 元素上。

stitchTiles, 类型为 SVGAnimatedEnumeration,只读

对应 stitchTiles 属性,位于给定的 feTurbulence 元素上。该属性接受此接口定义的 SVG_TURBULENCE_TYPE_* 常量之一。

type, 类型为 SVGAnimatedEnumeration,只读

对应 type 属性,位于给定的 feTurbulence 元素上。该属性接受此接口定义的 SVG_STITCHTYPE_* 常量之一。

更改

2014年11月25日工作草案以来,进行了以下重要更改:

2013年11月26日工作草案以来,进行了以下重要更改:

2012年10月25日工作草案以来,进行了以下重要更改:

有关更详细和长期的更改,请参阅变更日志

致谢

编辑们要感谢Robert O’Callahan、Coralie Mercier、Chris Lilley、Nikos Andronikos、Stephen Chenney、Simon Fraser、Tavmjong Bah、Robert Longson、Cameron McCormack、Brad Kemper、Tab Atkins、Brian Birtles、Michael Mullany、Rik Cabanier、Anne van Kesteren、Boris Zbarsky、Kristopher Giesing、Stephen White、Jasper van de Gronde、Kang-Hao Lu、Paul LeBeau、Debarshi Ray、Jarek Foksa、Sebastian Zartner、Yuqian Li、Amelia Bellamy-Royds和Max Vujovic对其细致的审查、评论和纠正表示感谢。

一致性

文档约定

一致性要求通过描述性断言和RFC 2119术语的组合来表达。关键字“MUST”、“MUST NOT”、“REQUIRED”、“SHALL”、“SHALL NOT”、“SHOULD”、“SHOULD NOT”、“RECOMMENDED”、“MAY”和“OPTIONAL”在本文件的规范部分应按照RFC 2119中的描述进行解释。然而,为了可读性,这些词在本规范中并未全部使用大写字母。

除非明确标记为非规范的部分、示例和注释,否则本规范的所有文本均为规范性内容。[RFC2119]

本规范中的示例以“例如”开头,或通过class="example"与规范性文本分开,如下所示:

这是一个信息性示例。

信息性注释以“注释”开头,并通过class="note"与规范性文本分开,如下所示:

注意,这是一个信息性注释。

建议性内容是规范性部分,旨在引起特别关注,并通过<strong class="advisement">与其他规范性文本分开,如下所示:UA必须提供可访问的替代方案。

一致性类别

本规范的一致性定义了三个一致性类别:

样式表
一个CSS样式表
渲染器
一个UA,它解释样式表的语义并渲染使用它们的文档。
创作工具
一个UA,它编写样式表。

如果样式表中的所有语句都符合该模块定义的通用CSS语法及各功能定义的单独语法,则该样式表符合本规范。

如果渲染器除了按照适当的规范解释样式表外,还支持本规范定义的所有功能,并正确解析它们并相应地渲染文档,则该渲染器符合本规范。然而,由于设备的限制,UA无法正确渲染文档,这并不使UA不符合规范。(例如,UA不需要在单色显示器上渲染颜色。)

如果创作工具编写的样式表在语法上符合通用CSS语法及该模块中每个功能的单独语法,并满足本模块描述的样式表的所有其他一致性要求,则该创作工具符合本规范。

CSS负责任实施要求

以下章节定义了为负责任地实施CSS而需满足的几个一致性要求,旨在促进当前和未来的互操作性。

部分实现

为了使作者能够利用前向兼容解析规则来分配回退值,CSS渲染器必须将其无用的支持级别的所有@规则、属性、属性值、关键字和其他语法结构视为无效 (并根据需要忽略)。特别是,用户代理不得在单个多值属性声明中选择性地忽略不支持的属性值而仅支持受支持的值: 如果任何值被认为无效(如不支持的值必须被视为),CSS要求忽略整个声明。

不稳定和专有功能的实现

为了避免与未来稳定的CSS功能冲突,CSS工作组建议遵循最佳实践,以实现不稳定功能和专有扩展到CSS。

CR级功能的实现

一旦规范进入候选建议阶段,实施者应发布任何能够根据规范正确实现的无前缀的CR级功能实现,并应避免暴露该功能的带前缀变体。

为了建立和维护CSS在不同实现之间的互操作性,CSS工作组要求非实验性的CSS渲染器在发布任何CSS功能的无前缀实现之前,向W3C提交实现报告(如果必要,还包括该实现报告中使用的测试用例)。提交给W3C的测试用例将由CSS工作组进行审核和修正。

有关提交测试用例和实现报告的更多信息,请参阅CSS工作组网站https://www.w3.org/Style/CSS/Test/。如有问题,请发送至public-css-testsuite@w3.org邮件列表。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[COMPOSITING-1]
Rik Cabanier; Nikos Andronikos. Compositing and Blending Level 1. 2015年1月13日. CR. URL: https://www.w3.org/TR/compositing-1/
[CSS-CASCADE-4]
Elika Etemad; Tab Atkins Jr.. CSS Cascading and Inheritance Level 4. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-cascade-4/
[CSS-COLOR-4]
Tab Atkins Jr.; Chris Lilley. CSS Color Module Level 4. 2016年7月5日. WD. URL: https://www.w3.org/TR/css-color-4/
[CSS-DISPLAY-3]
Tab Atkins Jr.; Elika Etemad. CSS Display Module Level 3. 2018年8月28日. CR. URL: https://www.w3.org/TR/css-display-3/
[CSS-FONTS-3]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 3. 2018年9月20日. REC. URL: https://www.w3.org/TR/css-fonts-3/
[CSS-FONTS-4]
John Daggett; Myles Maxfield; Chris Lilley. CSS Fonts Module Level 4. 2018年9月20日. WD. URL: https://www.w3.org/TR/css-fonts-4/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS Masking Module Level 1. 2014年8月26日. CR. URL: https://www.w3.org/TR/css-masking-1/
[CSS-OVERFLOW-3]
David Baron; Elika Etemad; Florian Rivoal. CSS Overflow Module Level 3. 2018年7月31日. WD. URL: https://www.w3.org/TR/css-overflow-3/
[CSS-POSITION-3]
Rossen Atanassov; Arron Eicholz. CSS Positioned Layout Module Level 3. 2016年5月17日. WD. URL: https://www.w3.org/TR/css-position-3/
[CSS-TEXT-3]
Elika Etemad; Koji Ishii; Florian Rivoal. CSS Text Module Level 3. 2018年12月12日. WD. URL: https://www.w3.org/TR/css-text-3/
[CSS-TEXT-DECOR-3]
Elika Etemad; Koji Ishii. CSS Text Decoration Module Level 3. 2018年7月3日. CR. URL: https://www.w3.org/TR/css-text-decor-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2018年11月30日. WD. URL: https://www.w3.org/TR/css-transforms-1/
[CSS-UI-3]
Tantek Çelik; Florian Rivoal. CSS Basic User Interface Module Level 3 (CSS3 UI). 2018年6月21日. REC. URL: https://www.w3.org/TR/css-ui-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 4. 2018年10月10日. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS-WRITING-MODES-3]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 3. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-3/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2018年5月24日. CR. URL: https://www.w3.org/TR/css-writing-modes-4/
[CSS21]
Bert Bos; et al. Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification. 2011年6月7日. REC. URL: https://www.w3.org/TR/CSS2/
[CSS3-IMAGES]
Elika Etemad; Tab Atkins Jr.. CSS Image Values and Replaced Content Module Level 3. 2012年4月17日. CR. URL: https://www.w3.org/TR/css3-images/
[CSS3BG]
Bert Bos; Elika Etemad; Brad Kemper. CSS Backgrounds and Borders Module Level 3. 2017年10月17日. CR. URL: https://www.w3.org/TR/css-backgrounds-3/
[CSS3COLOR]
Tantek Çelik; Chris Lilley; David Baron. CSS Color Module Level 3. 2018年6月19日. REC. URL: https://www.w3.org/TR/css-color-3/
[CSS3VAL]
Tab Atkins Jr.; Elika Etemad. CSS Values and Units Module Level 3. 2018年8月14日. CR. URL: https://www.w3.org/TR/css-values-3/
[HTML]
Anne van Kesteren; et al. HTML Standard. 现行标准. URL: https://html.spec.whatwg.org/multipage/
[HTML5]
Ian Hickson; et al. HTML5. 2018年3月27日. REC. URL: https://www.w3.org/TR/html5/
[MEDIAQUERIES-5]
Media Queries Level 5 URL: https://drafts.csswg.org/mediaqueries-5/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997年3月. 最佳当前实践. URL: https://tools.ietf.org/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. Selectors Level 4. 2018年11月21日. WD. URL: https://www.w3.org/TR/selectors-4/
[SVG11]
Erik Dahlström; et al. Scalable Vector Graphics (SVG) 1.1 (第二版). 2011年8月16日. REC. URL: https://www.w3.org/TR/SVG11/
[SVG2]
Amelia Bellamy-Royds; et al. Scalable Vector Graphics (SVG) 2. 2018年10月4日. CR. URL: https://www.w3.org/TR/SVG2/
[WebIDL]
Cameron McCormack; Boris Zbarsky; Tobie Langel. Web IDL. 2016年12月15日. ED. URL: https://heycam.github.io/webidl/

非规范性引用

[ArTD]
B. Jacob. Arithmetic Timing Differences. URL: https://wiki.mozilla.org/User:Bjacob/ArithmeticTimingDifferences
[Cmam]
IEC. IEC 61966-2-1:1999 Colour measurement and management - Part 2-1: Colour management - Default RGB colour space - sRGB. URL: https://webstore.iec.ch/publication/6169
[CSS3-ANIMATIONS]
Dean Jackson; et al. CSS Animations Level 1. 2018年10月11日. WD. URL: https://www.w3.org/TR/css-animations-1/
[PORTERDUFF]
Thomas Porter; Tom Duff. Compositing digital images.
[TaM]
Ebert et al, AP Professional. Texturing and Modeling. 1994.

属性索引

名称 初始值 应用于 继承性 百分比 可动画性 规范顺序 计算值 媒体
color-interpolation-filters auto | sRGB | linearRGB linearRGB 所有过滤器基元 n/a 按语法 按指定 视觉
filter none | <filter-value-list> none 所有元素。在SVG中,它适用于容器元素(不包括defs元素),所有图形元素以及use元素。 n/a 参见滤镜动画的描述。 按语法 按指定 视觉
flood-color <color> 黑色 feFlood和feDropShadow元素 n/a 作为颜色 按语法 按指定 视觉
flood-opacity <alpha-value> 1 feFlood和feDropShadow元素 n/a 作为数字或百分比 按语法 指定值转换为数字,限制在[0,1]范围内 视觉
lighting-color <color> 白色 feDiffuseLighting和feSpecularLighting元素 n/a 作为颜色 按语法 按指定 视觉

IDL索引

interface SVGFilterElement : SVGElement {
  readonly attribute SVGAnimatedEnumeration filterUnits;
  readonly attribute SVGAnimatedEnumeration primitiveUnits;
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
};

SVGFilterElement includes SVGURIReference;

interface mixin SVGFilterPrimitiveStandardAttributes {
  readonly attribute SVGAnimatedLength x;
  readonly attribute SVGAnimatedLength y;
  readonly attribute SVGAnimatedLength width;
  readonly attribute SVGAnimatedLength height;
  readonly attribute SVGAnimatedString result;
};

interface SVGFEBlendElement : SVGElement {

  // Blend Mode Types
  const unsigned short SVG_FEBLEND_MODE_UNKNOWN = 0;
  const unsigned short SVG_FEBLEND_MODE_NORMAL = 1;
  const unsigned short SVG_FEBLEND_MODE_MULTIPLY = 2;
  const unsigned short SVG_FEBLEND_MODE_SCREEN = 3;
  const unsigned short SVG_FEBLEND_MODE_DARKEN = 4;
  const unsigned short SVG_FEBLEND_MODE_LIGHTEN = 5;
  const unsigned short SVG_FEBLEND_MODE_OVERLAY = 6;
  const unsigned short SVG_FEBLEND_MODE_COLOR_DODGE = 7;
  const unsigned short SVG_FEBLEND_MODE_COLOR_BURN = 8;
  const unsigned short SVG_FEBLEND_MODE_HARD_LIGHT = 9;
  const unsigned short SVG_FEBLEND_MODE_SOFT_LIGHT = 10;
  const unsigned short SVG_FEBLEND_MODE_DIFFERENCE = 11;
  const unsigned short SVG_FEBLEND_MODE_EXCLUSION = 12;
  const unsigned short SVG_FEBLEND_MODE_HUE = 13;
  const unsigned short SVG_FEBLEND_MODE_SATURATION = 14;
  const unsigned short SVG_FEBLEND_MODE_COLOR = 15;
  const unsigned short SVG_FEBLEND_MODE_LUMINOSITY = 16;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration mode;
};

SVGFEBlendElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEColorMatrixElement : SVGElement {

  // Color Matrix Types
  const unsigned short SVG_FECOLORMATRIX_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOLORMATRIX_TYPE_MATRIX = 1;
  const unsigned short SVG_FECOLORMATRIX_TYPE_SATURATE = 2;
  const unsigned short SVG_FECOLORMATRIX_TYPE_HUEROTATE = 3;
  const unsigned short SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList values;
};

SVGFEColorMatrixElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEComponentTransferElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFEComponentTransferElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGComponentTransferFunctionElement : SVGElement {

  // Component Transfer Types
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_UNKNOWN = 0;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY = 1;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_TABLE = 2;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE = 3;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_LINEAR = 4;
  const unsigned short SVG_FECOMPONENTTRANSFER_TYPE_GAMMA = 5;

  readonly attribute SVGAnimatedEnumeration type;
  readonly attribute SVGAnimatedNumberList tableValues;
  readonly attribute SVGAnimatedNumber slope;
  readonly attribute SVGAnimatedNumber intercept;
  readonly attribute SVGAnimatedNumber amplitude;
  readonly attribute SVGAnimatedNumber exponent;
  readonly attribute SVGAnimatedNumber offset;
};

interface SVGFEFuncRElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncGElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncBElement : SVGComponentTransferFunctionElement {
};

interface SVGFEFuncAElement : SVGComponentTransferFunctionElement {
};

interface SVGFECompositeElement : SVGElement {

  // Composite Operators
  const unsigned short SVG_FECOMPOSITE_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OVER = 1;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_IN = 2;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_OUT = 3;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ATOP = 4;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_XOR = 5;
  const unsigned short SVG_FECOMPOSITE_OPERATOR_ARITHMETIC = 6;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber k1;
  readonly attribute SVGAnimatedNumber k2;
  readonly attribute SVGAnimatedNumber k3;
  readonly attribute SVGAnimatedNumber k4;
};

SVGFECompositeElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEConvolveMatrixElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedInteger orderX;
  readonly attribute SVGAnimatedInteger orderY;
  readonly attribute SVGAnimatedNumberList kernelMatrix;
  readonly attribute SVGAnimatedNumber divisor;
  readonly attribute SVGAnimatedNumber bias;
  readonly attribute SVGAnimatedInteger targetX;
  readonly attribute SVGAnimatedInteger targetY;
  readonly attribute SVGAnimatedEnumeration edgeMode;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
  readonly attribute SVGAnimatedBoolean preserveAlpha;
};

SVGFEConvolveMatrixElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDiffuseLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber diffuseConstant;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFEDiffuseLightingElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDistantLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber azimuth;
  readonly attribute SVGAnimatedNumber elevation;
};

interface SVGFEPointLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
};

interface SVGFESpotLightElement : SVGElement {
  readonly attribute SVGAnimatedNumber x;
  readonly attribute SVGAnimatedNumber y;
  readonly attribute SVGAnimatedNumber z;
  readonly attribute SVGAnimatedNumber pointsAtX;
  readonly attribute SVGAnimatedNumber pointsAtY;
  readonly attribute SVGAnimatedNumber pointsAtZ;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber limitingConeAngle;
};

interface SVGFEDisplacementMapElement : SVGElement {

  // Channel Selectors
  const unsigned short SVG_CHANNEL_UNKNOWN = 0;
  const unsigned short SVG_CHANNEL_R = 1;
  const unsigned short SVG_CHANNEL_G = 2;
  const unsigned short SVG_CHANNEL_B = 3;
  const unsigned short SVG_CHANNEL_A = 4;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedString in2;
  readonly attribute SVGAnimatedNumber scale;
  readonly attribute SVGAnimatedEnumeration xChannelSelector;
  readonly attribute SVGAnimatedEnumeration yChannelSelector;
};

SVGFEDisplacementMapElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEDropShadowElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEDropShadowElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEFloodElement : SVGElement {
};

SVGFEFloodElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEGaussianBlurElement : SVGElement {

  // Edge Mode Values
  const unsigned short SVG_EDGEMODE_UNKNOWN = 0;
  const unsigned short SVG_EDGEMODE_DUPLICATE = 1;
  const unsigned short SVG_EDGEMODE_WRAP = 2;
  const unsigned short SVG_EDGEMODE_NONE = 3;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber stdDeviationX;
  readonly attribute SVGAnimatedNumber stdDeviationY;
  readonly attribute SVGAnimatedEnumeration edgeMode;

  void setStdDeviation(float stdDeviationX, float stdDeviationY);
};

SVGFEGaussianBlurElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEImageElement : SVGElement {
  readonly attribute SVGAnimatedPreserveAspectRatio preserveAspectRatio;
  readonly attribute SVGAnimatedString crossOrigin;
};

SVGFEImageElement includes SVGFilterPrimitiveStandardAttributes;
SVGFEImageElement includes SVGURIReference;

interface SVGFEMergeElement : SVGElement {
};

SVGFEMergeElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEMergeNodeElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

interface SVGFEMorphologyElement : SVGElement {

  // Morphology Operators
  const unsigned short SVG_MORPHOLOGY_OPERATOR_UNKNOWN = 0;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_ERODE = 1;
  const unsigned short SVG_MORPHOLOGY_OPERATOR_DILATE = 2;

  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedEnumeration operator;
  readonly attribute SVGAnimatedNumber radiusX;
  readonly attribute SVGAnimatedNumber radiusY;
};

SVGFEMorphologyElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFEOffsetElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber dx;
  readonly attribute SVGAnimatedNumber dy;
};

SVGFEOffsetElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFESpecularLightingElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
  readonly attribute SVGAnimatedNumber surfaceScale;
  readonly attribute SVGAnimatedNumber specularConstant;
  readonly attribute SVGAnimatedNumber specularExponent;
  readonly attribute SVGAnimatedNumber kernelUnitLengthX;
  readonly attribute SVGAnimatedNumber kernelUnitLengthY;
};

SVGFESpecularLightingElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFETileElement : SVGElement {
  readonly attribute SVGAnimatedString in1;
};

SVGFETileElement includes SVGFilterPrimitiveStandardAttributes;

interface SVGFETurbulenceElement : SVGElement {

  // Turbulence Types
  const unsigned short SVG_TURBULENCE_TYPE_UNKNOWN = 0;
  const unsigned short SVG_TURBULENCE_TYPE_FRACTALNOISE = 1;
  const unsigned short SVG_TURBULENCE_TYPE_TURBULENCE = 2;

  // Stitch Options
  const unsigned short SVG_STITCHTYPE_UNKNOWN = 0;
  const unsigned short SVG_STITCHTYPE_STITCH = 1;
  const unsigned short SVG_STITCHTYPE_NOSTITCH = 2;

  readonly attribute SVGAnimatedNumber baseFrequencyX;
  readonly attribute SVGAnimatedNumber baseFrequencyY;
  readonly attribute SVGAnimatedInteger numOctaves;
  readonly attribute SVGAnimatedNumber seed;
  readonly attribute SVGAnimatedEnumeration stitchTiles;
  readonly attribute SVGAnimatedEnumeration type;
};

SVGFETurbulenceElement includes SVGFilterPrimitiveStandardAttributes;

问题索引

滤镜在固定背景图像上如何表现? <https://github.com/w3c/csswg-drafts/issues/238>
如何处理值列表中的无效条目数量? <https://github.com/w3c/csswg-drafts/issues/237>
实现与规范不符。 <https://github.com/w3c/csswg-drafts/issues/113>
计算滤镜函数的距离。 <https://github.com/w3c/csswg-drafts/issues/91>