1. 简介
本节不具有规范性
滤镜效果是应用于元素的图形操作,当元素被绘制到文档中时起作用。它是一种基于图像的效果,输入可以是零个或多个图像,效果的特定参数,然后产生一个图像作为输出。输出的图像可以渲染到文档中替代原始元素,作为另一个滤镜效果的输入图像,或作为CSS图像值提供。
一个简单的滤镜效果示例是“填充色”,它不需要任何图像输入,但有一个定义颜色的参数。效果产生一个完全填充指定颜色的输出图像。一个稍微复杂的示例是“反转”,它需要一个图像输入(通常是元素按正常方式渲染到父级的图像),并调整每个像素,使其具有相反的颜色值。
滤镜效果以两种复杂度的层级暴露出来:
-
一组简单的预设滤镜函数,通过名称调用。虽然不够强大,但这些函数方便易懂,提供了一种简单的方法来实现常见效果,如模糊。预设滤镜也可以通过[CSS3-ANIMATIONS]进行动画化。
-
通过标记描述的各个滤镜效果的图,定义了整体效果。该图对其输入不具有依赖性,因此效果可以应用于任何内容。虽然这些图是由可能单独简单的效果组合而成,但整个图可以产生复杂的效果。下面给出了一个示例。

一个被过滤的对象的初始示例。
上面示例中使用的滤镜效果在此重复,左列显示每个滤镜原语的参考编号:
1 2 3 4 5 6 |
|
下图显示了来自六个滤镜元素的中间图像结果:

源图形

滤镜原语1后

滤镜原语2后

滤镜原语3后

滤镜原语4后

滤镜原语5后

滤镜原语6后
-
滤镜原语feGaussianBlur接收输入SourceAlpha,即源图形的alpha通道。结果存储在一个名为“blur”的临时缓冲区中。请注意,“blur”作为输入同时用于滤镜原语2和3。
-
滤镜原语feOffset接收缓冲区“blur”,在x和y方向上将结果向正方向移动,并创建一个新缓冲区“offsetBlur”。效果是生成一个阴影。
-
滤镜原语feSpecularLighting使用缓冲区“blur”作为表面高度模型,并生成来自单点光源的光照效果。结果存储在缓冲区“specOut”中。
-
滤镜原语feComposite通过源图形的原始alpha通道屏蔽滤镜原语3的结果,使中间结果不超过原始源图形的尺寸。
-
滤镜原语feComposite将高光效果与原始源图形合成。
-
滤镜原语feMerge将两层合成在一起。下层由滤镜原语2的阴影结果组成,上层由滤镜原语5的高光效果结果组成。
2. 模块交互
本规范定义了一组影响应用这些属性的元素的视觉渲染的CSS属性;这些效果是在根据视觉格式模型对元素进行大小调整和定位之后应用的,出自[CSS21]。这些属性的某些值会导致创建包含块,和/或创建堆叠上下文。
合成模型遵循SVG的合成模型[SVG11]:首先应用任何滤镜效果,然后是任何剪裁、遮罩和透明度[CSS3COLOR]。这些效果均在其他CSS效果(如边框)之后应用[CSS3BG]。
本规范中的某些属性和元素定义需要SVG 1.1的实现[SVG11]。不支持SVG的UA不得实现color-interpolation-filters,flood-color, flood-opacity和lighting-color属性,以及filter 元素,feMergeNode元素,传递函数元素 以及滤镜原语元素。
3. 值
本规范遵循CSS属性定义惯例出自[CSS21]。这些规范中未定义的值类型定义在CSS值与单位模块第3级[CSS3VAL]中。
除了其定义中列出的特定属性值之外,本规范中定义的所有属性还接受inherit关键字作为其属性值。为了可读性,未显式重复。
4. 术语
在本规范中使用时,术语具有本节中指定的含义。
- 滤镜原语,
filter-primitive
-
控制滤镜元素输出的元素集合,特别是:feSpotLight,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDropShadow,feFlood, feGaussianBlur,feImage,feMerge,feMorphology,feOffset,feSpecularLighting,feTile,feTurbulence。
- 透传滤镜
-
透传滤镜的输出等于滤镜原语的主输入。
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对命中测试没有影响。
滤镜如何在固定背景图像上表现? <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属性。
注意:不接受扩展值或多重阴影作为本规范的这一层级。
注意:标准偏差不同于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> 中的值按指定计算,但有以下例外情况:
-
省略的值会包括在内,并计算为默认值。
-
<drop-shadow()> 从 <color> 的计算值开始,然后计算 <length> 的值。
6.3. 滤镜函数的序列化
要序列化 <filter-function>,请按其各自的语法顺序序列化,避免使用 <calc()> 表达式,并按指定序列化滤镜参数,避免 <calc()> 转换,用单个空格连接空格分隔的标记,并在每个序列化的逗号后加一个空格。
6.4. 滤镜函数的插值
对于 <filter-function> 中值的插值,必须执行以下列表中的第一个匹配条件对应的步骤:
- <blur()>
-
按计算值插值长度值。
- <brightness()>
- <contrast()>
- <grayscale()>
- <invert()>
- <opacity()>
- <saturate()>
- <sepia()>
- <contrast()>
-
将百分比值转换为数字,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
-
如果 filterUnits 等于 userSpaceOnUse,那么 x,y,width,height 表示在引用 filter 元素时用户坐标系中的值(即引用 filter 元素的元素的用户坐标系)。
如果 filterUnits 等于 objectBoundingBox,那么 x,y,width,height 表示引用元素边界框的分数或百分比 (参见 对象边界框单位)。
filterUnits 的初始值是 objectBoundingBox。
可动画: 是。
- x, y, width, height
-
这些属性在画布上定义了该滤镜应用的矩形区域。
这些属性的坐标系统取决于 filterUnits 属性的值。
此矩形的边界充当了每个 滤镜原语 的硬剪裁区域;因此,如果给定滤镜原语的效果超出了矩形的边界(这在使用非常大的 feGaussianBlur 滤镜原语时会发生),部分效果将被剪裁。
ng of the element which referenced the filter.
可动画: 是。
注意: filterUnits 的两种可能值 (即 objectBoundingBox 和 userSpaceOnUse) 均会生成一个其坐标系统的 X 轴和 Y 轴分别平行于将应用滤镜的元素的 局部坐标系统 的滤镜区域。
注意: 有时,当滤镜区域可以直接映射到设备像素时,实施者可以实现更快的性能;因此,为了在显示设备上获得最佳性能,建议作者定义其区域,使用户代理可以像素对像素地将 滤镜区域 与背景对齐。特别是,为了获得最佳滤镜效果性能,请避免旋转或倾斜用户坐标系。
注意: 由于滤镜效果可能会影响对象边界框紧密配合之外的位,因此通常需要提供填充空间。出于这些目的,可以为 x,y 提供负百分比值,并为 width,height 提供大于 100% 的百分比值。例如,这就是滤镜区域默认值为 x="-10%" y="-10%" width="120%" height="120%"
的原因。
9. 滤镜原语
9.1. 概述
本节介绍了可组合以实现特定滤镜效果的各种滤镜原语。
除非另有说明,所有图像滤镜均对预乘的 RGBA 样本进行操作。一些滤镜如 feColorMatrix 和 feComponentTransfer 在非预乘数据上操作更加自然。在滤镜操作期间,所有颜色值必须暂时转换为当前滤镜所需的颜色乘法。
注意: 假定所有输入图像均为预乘的 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-interpolation 或 color-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
-
此关键字表示原始输入到 滤镜 元素的图形元素。SourceAlpha 与 SourceGraphic 的所有规则相同,但仅使用 alpha 通道。输入图像是一个 RGBA 图像,其 RGB 通道为隐式黑色,但其 alpha 通道与 SourceGraphic 相同。
注意: 如果使用此选项,则某些实现可能需要光栅化图形元素以提取 alpha 通道。
BackgroundImage
-
此关键字表示当前隔离组在调用 滤镜 元素时定义的滤镜区域背后的背景。参见 isolation 属性 [COMPOSITING-1]。
BackgroundAlpha
-
与 BackgroundImage 相同,但仅使用 alpha 通道。参见 SourceAlpha 和 isolation 属性 [COMPOSITING-1]。
FillPaint
-
此关键字表示目标元素上 fill 属性的值。FillPaint 图像的概念上是无限的。通常此图像在各处都不透明,但如果“油漆”本身具有 alpha,则可能不是这种情况,例如在渐变或图案本身包含透明或半透明部分的情况下。如果 fill 引用了一个油漆服务器,则油漆服务器的坐标空间由过滤对象定义。例如,如果油漆服务器需要使用对象的 objectBoundingBox,则过滤对象的对象边界框定义了油漆服务器的参考大小。如果油漆服务器需要使用 userSpaceOnUse,则滤镜对象的 本地坐标系统 中最近的视口定义了油漆服务器的参考大小。
StrokePaint
-
此关键字表示目标元素上 stroke 属性的值。StrokePaint 图像的概念上是无限的。参见上文 FillPaint 了解更多细节。
9.3. 滤镜原语树
没有或只有一个滤镜原语输入的滤镜原语可以链接在一起,形成一个滤镜链。例如,表示一个包含两个或更多 <filter-value-list> 的滤镜原语,是滤镜链的一个例子。每个滤镜原语都将前一个滤镜原语的结果作为输入。
< filter id = "filter" >
< feColorMatrix type = "hueRotate" values = "45" />
< feOffset dx = "10" dy = "10" />
< feGaussianBlur stdDeviation = "3" />
</ filter >
feColorMatrix,feOffset 和 feGaussianBlur 组成了一个滤镜链。
feColorMatrix 以 SourceGraphic 作为输入。结果作为 feOffset 的输入,随后其结果作为 feGaussianBlur 的输入。
某些滤镜原语可能有多个滤镜原语输入。通过使用 in 和 result 属性,可以将多个滤镜原语组合成一个复杂的滤镜结构。由于滤镜原语的非前向引用限制,每个滤镜结构都可以表示为一棵树,即 滤镜原语树。滤镜原语树的根滤镜原语是 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 >
上面的滤镜包含两个滤镜原语树,其滤镜原语为:
-
feColorMatrix,feOffset 和 feGaussianBlur(feGaussianBlur 为该树的根滤镜原语)以及
-
feFlood 和 feComposite(feComposite 为该树的根滤镜原语)。
这两个滤镜原语树之间没有连接。只有第二个,即主要滤镜原语树参与了滤镜处理。第一个树可以被实现忽略。
9.4. 滤镜原语子区域
所有 滤镜原语 都具有 x、y、width 和 height 属性,它们共同定义了 滤镜原语子区域,该区域限制了给定的 滤镜原语 的计算和渲染。x、y、width 和 height 属性根据与其他 滤镜原语 坐标和长度属性相同的规则定义,因此代表由 primitiveUnits 属性在 filter 元素上建立的坐标系中的值。
x、y、width 和 height 默认为所有引用节点的子区域的联合(即最紧密适合的边界框)。如果没有引用节点(例如 feImage 或 feTurbulence),或者一个或多个引用节点是标准输入(其中之一是 SourceGraphic、 SourceAlpha、BackgroundImage、BackgroundAlpha、FillPaint 或 StrokePaint),或者对于 feTile(这是一个特殊情况,因为它的主要功能是将引用的节点在 X 和 Y 方向上复制,从而产生通常更大的结果),默认子区域为 0%, 0%, 100%, 100%,其中百分比是相对于 滤镜区域 的尺寸的,因此默认的 滤镜原语子区域 等于 滤镜区域。
如果 滤镜原语子区域 的宽度或高度为负值或零,则滤镜原语的效果被禁用。
滤镜区域 作为一个硬性裁剪矩形作用于滤镜原语的输入图像。
滤镜原语子区域 作为一个硬性裁剪矩形作用于滤镜原语的结果。
所有的中间离屏都被定义为不超过 滤镜原语子区域 和 滤镜区域 的交集。滤镜区域 和任何滤镜原语子区域应设置为足够大,以容纳任何与 滤镜区域 或滤镜原语子区域部分相交的像素。
< 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 >

子区域示例
在上面的示例中,每个矩形都有一个十字和一个圆形元素。每个圆形元素应用了不同的滤镜,但都使用了相同的 滤镜原语子区域。滤镜输出应该仅限于 滤镜原语子区域,因此你应该看不到圆形本身,只能看到构成 滤镜原语子区域 的矩形。
-
左上角的矩形显示了一个 feFlood,其 flood-opacity: 75%,因此十字应该可以透过中间的绿色矩形可见。
-
左下角的矩形显示了一个 feMerge,它将 SourceGraphic 与 FillPaint 合并。由于圆形具有
fill-opacity="0.5"
,因此它也会是半透明的,使得十字可以透过中间的绿色矩形看到。 -
右上角的矩形显示了一个 feBlend,其
mode="multiply"
。由于在这种情况下圆形不是透明的,结果是完全不透明的。矩形应该是深绿色的,十字不能透过它看到。
9.5. 滤镜原语 feBlend
名称: | feBlend
|
---|---|
类别: | 滤镜原语 |
内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEBlendElement |
此滤镜使用常见的图像处理软件的混合模式将两个对象混合在一起。它执行两个输入图像的逐像素组合。(参见 [COMPOSITING-1]。)
属性定义:
mode
= "<blend-mode>"-
一种由“合成与混合 1 级”定义的混合模式,[COMPOSITING-1],其中输入 in 表示源
Cs
,第二个输入 in2 表示 背景Cb
。此滤镜原语的输出Cm
是Cs
与Cb
混合的结果。可动画:是。
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 示例
9.6. 滤镜原语 feColorMatrix
名称: | feColorMatrix
|
---|---|
类别: | 滤镜原语 |
内容模型: | 任意数量的 描述元素, animate, script, set 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEColorMatrixElement |
此滤镜应用了矩阵转换:
对输入图形的每个像素的 RGBA 颜色和 alpha 值进行矩阵转换,生成具有新 RGBA 颜色和 alpha 值的结果。
计算是在非预乘的颜色值上进行的。
属性定义:
type
= "matrix
|saturate
|hueRotate
|luminanceToAlpha
"-
指示矩阵操作的类型。关键字 matrix 表示将提供完整的 5x4 矩阵值。其他关键字代表便捷的快捷方式,允许在不指定完整矩阵的情况下执行常用的颜色操作。
可动画: 是。
values
= "list of <number>s"-
-
对于
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 操作等同于以下矩阵操作:注意: 一个值为 0 的情况下,生成的滤镜效果将完全去饱和(灰度化),而一个值为 1 则让滤镜输入图像不做任何更改地通过。超出 0..1 范围的值会分别导致滤镜输入图像的欠饱和或过饱和。
注意: 与以前的规范文本相比,亮度系数的精度有所提高 [Cmam]。
-
对于
type="hueRotate"
,values 是一个单一的实数值(以度数表示)。hueRotate 操作等同于以下矩阵操作:其中 a00, a01 等项的计算方式如下:
因此,色相矩阵的左上角项为:
-
对于
type="luminanceToAlpha"
,values 不适用。luminanceToAlpha 操作等同于以下矩阵操作:
- 如果
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 示例
9.7. 滤镜原语 feComponentTransfer
名称: |
feComponentTransfer
|
---|---|
分类: | 滤镜原语 |
内容模型: | 任意数量的 描述性元素, feFuncR, feFuncG, feFuncB, feFuncA, script 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEComponentTransferElement |
该滤镜原语执行数据的分量重映射,如下所示:
R' = feFuncR( R ) G' = feFuncG( G ) B' = feFuncB( B ) A' = feFuncA( A )
每个像素都执行这种操作。它允许诸如亮度调整、对比度调整、色彩平衡或阈值处理等操作。
这些计算是在非预乘颜色值上进行的。
feComponentTransfer 元素的子元素指定了四个通道的传输函数:
-
feFuncR - 输入图像红色分量的传输函数
-
feFuncG - 输入图像绿色分量的传输函数
-
feFuncB - 输入图像蓝色分量的传输函数
-
feFuncA - 输入图像 alpha 分量的传输函数
一组 feFuncR、feFuncG、feFuncB、feFuncA 元素也被称为传输函数元素。
以下规则适用于 feComponentTransfer 元素的处理:
-
如果指定了多个相同种类的 传输函数元素,则应使用最后一个出现的。
-
如果任何 传输函数元素 未指定,则应按这些元素设置为其 type 属性为 identity 来处理 feComponentTransfer。
9.7.1. 传输函数 feFuncR
名称: | feFuncR
|
---|---|
分类: | 传输函数元素 |
内容模型: | 可以包含任意数量的 描述性元素、animate、script、set 元素,顺序不限。 |
属性: | |
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
,函数由以下线性方程定义: -
对于
gamma
,函数由以下指数函数定义:
可动画:是。
-
tableValues
= "(<number> 列表)"-
当
type="table"
时,列表 <number> s v0,v1,...vn,以空格和/或逗号分隔,定义查找表。空列表将导致标识传输函数。如果未指定此属性,则效果就像提供了一个空列表。
可动画:是。
slope
= "<number>"-
当
type="linear"
时,线性函数的斜率。可动画:是。
intercept
= "<number>"-
当
type="linear"
时,线性函数的截距。可动画:是。
amplitude
= "<number>"-
当
type="gamma"
时,伽玛函数的振幅。可动画:是。
exponent
= "<number>"-
当
type="gamma"
时,伽玛函数的指数。可动画:是。
offset
= "<number>"-
当
type="gamma"
时,伽玛函数的偏移量。可动画:是。
< 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 示例
9.7.2. 传递函数 feFuncG
名称: | feFuncG
|
---|---|
类别: | 传递函数元素 |
内容模型: | 可包含任意数量的描述性元素,animate,script,set 元素,以任意顺序排列。 |
属性: | |
DOM 接口: | SVGFEFuncGElement |
有关属性值的定义,请参见 feFuncR。
9.7.3. 传递函数 feFuncB
名称: | feFuncB
|
---|---|
类别: | 传递函数元素 |
内容模型: | 可包含任意数量的描述性元素,animate,script,set 元素,以任意顺序排列。 |
属性: | |
DOM 接口: | SVGFEFuncBElement |
有关属性值的定义,请参见 feFuncR。
9.7.4. 传递函数 feFuncA
名称: | feFuncA
|
---|---|
类别: | 传递函数元素 |
内容模型: | 可包含任意数量的描述性元素,animate,script,set 元素,以任意顺序排列。 |
属性: | |
DOM 接口: | SVGFEFuncAElement |
有关属性值的定义,请参见 feFuncR。
9.8. 滤镜基元 feComposite
名称: | feComposite
|
---|---|
类别: | 滤镜基元 |
内容模型: | 可包含任意数量的描述性元素,animate,script,set 元素,以任意顺序排列。 |
属性: | |
DOM 接口: | SVGFECompositeElement |
此滤镜通过图像空间中逐像素组合两个输入图像,使用其中之一的 Porter-Duff [PORTERDUFF] 合成操作: over,in,atop,out,xor,lighter [COMPOSITING-1]。另外,还可以应用逐分量的arithmetic(算术)操作(结果限制在 [0..1] 范围内)。
arithmetic操作在将feDiffuseLighting和feSpecularLighting滤镜与纹理数据结合时非常有用。同时,它对于实现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] 定义了更多的合成关键词。通过切换输入滤镜基元in和in2,可以实现其他关键词的功能。
< 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 示例
9.9. 滤镜原语 feConvolveMatrix
名称: | feConvolveMatrix
|
---|---|
类别: | 滤镜原语 |
内容模型: | 任意数量的 描述性元素, animate, script, set 元素,顺序不限。 |
属性: | |
DOM接口: | SVGFEConvolveMatrixElement |
feConvolveMatrix应用矩阵卷积滤镜效果。卷积将输入图像中的像素与邻近的像素结合,以生成输出图像。通过卷积可以实现各种成像操作,包括模糊、边缘检测、锐化、浮雕和斜角等。
矩阵卷积基于一个n乘m的矩阵(卷积核),该矩阵描述了如何将输入图像中的像素值与邻近的像素值组合起来生成输出的像素值。通过对源像素及其相邻像素应用核矩阵,确定每个输出像素。每个像素的颜色值通过以下基本卷积公式计算得出:
其中“orderX”和“orderY”表示order属性的X和Y值,“targetX”表示targetX属性的值,“targetY”表示targetY属性的值,“kernelMatrix”表示kernelMatrix属性的值,“divisor”表示divisor属性的值,“bias”表示bias属性的值。
在上述公式中,卷积矩阵的值应用时相对于源图像和目标图像旋转180度,以符合许多计算机图形学教材中描述的卷积理论。
举例来说,假设你有一个5像素×5像素的输入图像,其颜色通道之一的色值如下:
并且你定义了一个3×3的卷积核,如下所示:
让我们关注图像中第二行第二列的颜色值(源像素值为120)。假设最简单的情况(输入图像的像素网格与卷积核的像素网格完美对齐),并假设属性 divisor、targetX 和 targetY 的默认值,那么生成的颜色值将为:
因为它们对像素进行操作,矩阵卷积本质上是依赖分辨率的。为了使 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:
通过使用 duplicate 扩展两个像素:
wrap 表示输入图像通过取自图像相对边缘的颜色值进行扩展。
通过使用 wrap 扩展两个像素:
none 的值表示输入图像以 R、G、B 和 A 的像素值为零进行扩展。
可动画: 是。
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)
函数定义为:
注意: 用户代理可以使用“快速逆平方根”优化方程并避免极端颜色值上的时间差异。有关时间攻击的更多详细信息,请参阅隐私和安全注意事项部分。
生成的 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))
在这些公式中,dx
和 dy
值(例如,I(x-dx,y-dy)
)表示相对于给定的 (x,y)
位置的增量,用于估算该点处表面的斜率。这些增量由属性 kernelUnitLength 的显式或隐式值决定。
左上角: | 顶行: | 右上角: |
---|---|---|
FACTORx=2/(3*dx) |
FACTORx=1/(3*dx) |
FACTORx=2/(3*dx) |
左列: | 内部像素: | 右列: |
FACTORx=1/(2*dx) |
FACTORx=1/(4*dx) |
FACTORx=1/(2*dx) |
左下角: | 底行: | 右下角: |
FACTORx=2/(3*dx) |
FACTORx=1/(3*dx) |
FACTORx=2/(3*dx) |
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 确定的单位)中列和行之间的距离,分别用于
dx
和dy
。通过为 kernelUnitLength 指定值,内核定义在一个可扩展的抽象坐标系中。
如果 kernelUnitLength 没有指定,
dx
和dy
值应该表示相对于给定(x,y)
位置的非常小的增量,这在某些情况下可以在中间图像离屏位图中实现。如果指定了负数或零值,将使用默认值。
注意: 此属性已被弃用,将被移除。它不提供创建平台独立结果的可靠方法。未来版本的规范将涵盖此用例。
可动画: 是。
光源由以下子元素之一定义:feDistantLight,fePointLight 或 feSpotLight。光源颜色由属性 lighting-color 指定。
9.11.过滤器基本元件 feDisplacementMap
名称: | feDisplacementMap
|
---|---|
类别: | 过滤器基本元件 |
内容模型: | 任意数量的描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
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)是由xChannelSelector和yChannelSelector指定的通道值的分量。 例如,若要使用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"-
初始值为A。
可动画:是。
yChannelSelector
= "R | G | B | A"-
初始值为A。
可动画:是。
in2
= "(参见in属性)"-
第二个输入图像,用于位移属性in中的像素。详见in属性的定义。
可动画:是。
9.12. 过滤器基本元件 feDropShadow
名称: | feDropShadow
|
---|---|
类别: | 过滤器基本元件 |
内容模型: | 任意数量的描述元素,animate,script,set 元素,顺序不限。 |
属性: | |
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 >
以上步骤如下:
-
获取输入到 feDropShadow 滤镜基元的 alpha 通道, 并根据 stdDeviation 进行处理, 如同应用以下 feGaussianBlur:
< feGaussianBlur in = " alpha-channel-of-feDropShadow-in " stdDeviation = " stdDeviation-of-feDropShadow " /> -
使用在 feDropShadow 元素中指定的 dx 和 dy 偏移第 1 步的结果, 相当于应用以下带有这些参数的 feOffset:
< feOffset dx = " dx-of-feDropShadow " dy = " dy-of-feDropShadow " result = "offsetblur" /> -
如同应用了一个 feFlood 元素, 并使用 flood-color 和 flood-opacity,如同在 feDropShadow 中指定:
< feFlood flood-color = " flood-color-of-feDropShadow " flood-opacity = " flood-opacity-of-feDropShadow " /> -
将第 3 步中的 feFlood 结果与第 2 步中的 feOffset 结果合成, 如同应用了一个 feComposite 滤镜基元, 且
operator="in"
:< feComposite in2 = "offsetblur" operator = "in" /> -
最终合并前一步的结果,如同执行以下 feMerge:
< feMerge > < feMergeNode /> < feMergeNode in = " in-of-feDropShadow " /> </ feMerge >
注意:虽然 feDropShadow 滤镜基元的定义说可以将其扩展为等效树, 但不要求必须这样实现。期望用户代理可以通过不必单独执行所有步骤来优化处理。
除了 DOM 接口 SVGFEDropShadowElement 之外,无法访问 feDropShadow 滤镜基元的内部, 这意味着如果滤镜基元实现为等效树,那么该树不应暴露给 DOM。
属性定义:
dx
= "<number>"-
投影的 x 偏移量。
此属性随后会传递给内部 feOffset 元素的
dx
属性。可动画化:是。
dy
= "<number>"-
投影的 y 偏移量。
此属性随后会传递给内部 feOffset 元素的
dy
属性。可动画化:是。
stdDeviation
= "<number-optional-number>"-
投影模糊操作的标准偏差。
初始值 为 stdDeviation 是 2。
此属性随后会传递给内部 feGaussianBlur 元素的
stdDeviation
属性。可动画化:是。
9.13. 滤镜基元 feFlood
名称: | feFlood
|
---|---|
分类: | 滤镜基元 |
内容模型: | 任意数量的 描述性元素、animate、script、set元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEFloodElement |
此滤镜基元会创建一个矩形,并填充 flood-color 和 flood-opacity 属性的颜色和不透明度值。该矩形与 滤镜基元子区域 一样大,该区域由 feFlood 元素建立。
9.13.1. 属性 flood-color
名称: | flood-color |
---|---|
值: | <color> |
初始值: | black |
适用对象: | feFlood 和 feDropShadow 元素 |
继承: | no |
百分比: | n/a |
计算值: | 按指定值 |
标准顺序: | 按语法 |
媒体类型: | 视觉 |
可动画: | 按计算值 |
flood-color 属性指定用于填充当前 滤镜基元子区域 的颜色。
flood-color 属性是 SVG 元素的 表示属性。
9.13.2. 属性 flood-opacity
名称: | flood-opacity |
---|---|
值: | <alpha-value> |
初始值: | 1 |
适用对象: | feFlood 和 feDropShadow 元素 |
继承: | no |
百分比: | n/a |
计算值: | 指定值转换为数字,并限制在 [0,1] 范围内 |
标准顺序: | 按语法 |
媒体类型: | 视觉 |
可动画: | 按计算值 |
flood-opacity 属性定义了用于整个 滤镜基元子区域 的不透明度值。如果 flood-color 值包含 alpha 通道,则 alpha 通道会与 flood-opacity 属性的计算值相乘。
flood-opacity 属性是 SVG 元素的 表示属性。
9.14. 滤镜基元 feGaussianBlur
名称: | feGaussianBlur
|
---|---|
类别: | 滤镜基元 |
内容模型: | 可包含任意数量的 描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
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>,第一个数值表示由 primitiveUnits 在 filter 元素上建立的坐标系 x 轴上的标准差。第二个值表示 Y 轴上的标准差。如果只提供一个数值,则该值用于 X 和 Y。
负值或零值会禁用给定滤镜原语的效果(即,结果为滤镜输入图像)。
如果 stdDeviation 在 X 或 Y 方向上仅为 0,则效果是仅在具有非零值的方向上应用模糊。
对于 初始值,stdDeviation 为 0。
可动画: 是。
edgeMode
= "duplicate | wrap | none"-
确定如何在必要时使用颜色值扩展输入图像,以便在核位于或接近输入图像边缘时可以应用矩阵操作。
duplicate
表示输入图像沿每个边缘按需扩展,通过复制输入图像边缘的颜色值。原始 N-by-M 图像,其中 m=M-1 和 n=N-1:
wrap
表示输入图像通过从图像的相对边缘获取颜色值来扩展。值 none 表示输入图像用 R、G、B 和 A 的像素值为零扩展。
可动画: 是。
本章开头的示例 使用 feGaussianBlur 滤镜原语来创建投影效果。
9.15. 滤镜原语 feImage
名称: | feImage
|
---|---|
分类: | 滤镜原语 |
内容模型: | 任意数量的 描述性元素,animate,animateTransform,script,set 元素,顺序不限。 |
属性: | |
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:href 和 href 属性,则后者覆盖前者。
可动画: 是。
preserveAspectRatio
= "[defer] <align> [<meetOrSlice>]"-
参见 preserveAspectRatio 属性。
初始值 为 xMidYMid meet。
可动画: 是。
crossorigin
= "anonymous | use-credentials"-
crossorigin 属性是一个CORS设置属性。其目的是允许来自允许跨域访问的第三方站点的图像与 feDisplacementMap 一起使用。定义详见 crossorigin 属性,适用于 img 标签 [HTML5],以及本规范中的 隐私与安全考虑 部分。
可动画: 否。
-
图像的默认位置。请注意,图像位于 过滤区域 的中心,并且在保持纵横比的情况下,具有适合该区域的最大尺寸。
-
图像拉伸以适应对象的边界框。
-
使用用户坐标放置的图像。请注意,图像首先被居中放置在一个与 过滤区域 大小相同的框中,并且在保持纵横比的情况下具有适合该框的最大尺寸。然后该框根据给定的 x 和 y 值相对于视口进行平移。
< 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 >

feImage 示例
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
|
---|---|
分类: | 无。 |
内容模型: | 任意数量的描述性元素,animate,script,set元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEMergeNodeElement |
9.17. 滤镜原语 feMorphology
名称: | feMorphology
|
---|---|
分类: | 滤镜原语 |
内容模型: | 任意数量的描述性元素,animate,script,set元素,顺序不限。 |
属性: | |
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"-
一个关键字,用于指示是侵蚀(即变细)还是膨胀(加粗)源图形。
可动画: 是。
radius
= "<number-optional-number>"-
操作的半径。如果提供了两个<number>值,第一个值表示 x 半径,第二个值表示 y 半径。如果只提供一个值,则该值同时用于 X 和 Y。这些值是在由 primitiveUnits 属性在 filter 元素上建立的坐标系中使用。
负值或零值会禁用给定滤镜原语的效果(即,结果是滤镜输入图像)。
可动画: 是。
< 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 示例
9.18. 滤镜原语 feOffset
名称: | feOffset
|
---|---|
类别: | 滤镜原语 |
内容模型: | 任意数量的 描述性元素, animate, script, set 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEOffsetElement |
该过滤器原语根据指定的向量相对于图像空间中的当前位置偏移输入图像。
这对于诸如阴影效果等效果非常重要。
应用此过滤器时,目标位置可能会在设备空间内偏移小于一个像素的距离。 在这种情况下,高质量的查看器应使用适当的插值技术,例如双线性或双三次插值。 这对于提供图像平滑移动的动态查看器尤为重要。对于静态查看器,这不是主要问题。应密切关注image-rendering属性设置以确定作者的意图。
属性定义:
dx
= "<number>"-
沿x轴偏移输入图形的量。偏移量以primitiveUnits属性在filter 元素上建立的坐标系中表示。
可动画:是。
dy
= "<number>"-
沿y轴偏移输入图形的量。偏移量以primitiveUnits属性在filter 元素上建立的坐标系中表示。
可动画:是。
本章开头的示例使用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 通道是颜色组件的最大值,因此当镜面光为零时,不会向图像添加额外的覆盖,而完全白色的高光将增加不透明度。
feDiffuseLighting 和 feSpecularLighting 滤镜通常会一起应用。实现可能会检测到这一点,并在一次传递中计算两个贴图,而不是两次。
属性定义:
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 的值决定的单位)分别用于
dx
和dy
,用于表面法线计算公式。通过为 kernelUnitLength 指定值,内核可以在可伸缩的抽象坐标系中定义。
如果未指定 kernelUnitLength,则
dx
和dy
值应表示相对于给定(x,y)
位置的非常小的增量,这在某些情况下可能实现为中间图像的离屏位图中的一个像素,这是一个基于像素的坐标系,因此可能不可缩放。为了在显示媒体和用户代理之间达到某种程度的一致性,必须为 kernelUnitLength 提供一个值。可动画: 是。
光源由以下子元素之一定义:feDistantLight、fePointLight 或 feSpotLight。光的颜色由属性 lighting-color 指定。
本章开头的示例使用 feSpecularLighting 滤镜基元来实现高度反射的 3D 发光效果。
9.20. 滤镜基元 feTile
名称: | feTile
|
---|---|
类别: | 滤镜基元 |
内容模型: | 任意数量的描述性元素、animate、script 和 set 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFETileElement |
该滤镜基元使用输入图像的重复平铺模式填充目标矩形。目标矩形与 滤镜基元子区域一样大,由 feTile 元素定义。
通常,输入图像已经通过其自身的 滤镜基元子区域定义了一个参考平铺。
feTile 在 X 和 Y
方向复制参考平铺以完全填充目标矩形。每个平铺的左上角位置为
(x + i*width, y + j*height)
,其中 (x,y)
表示输入图像的 滤镜基元子区域的左上角位置,
width
和 height
表示输入图像的 滤镜基元子区域 的宽度和高度,
i
和 j
可以是任意整数值。在大多数情况下,输入图像的 滤镜基元子区域 小于 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方向。
初始值为 baseFrequency 为 0。
负值是 不支持的。
可动画:是。
numOctaves
= "<integer>"-
噪声函数的numOctaves参数。
初始值为 numOctaves 为 1。
负值是 不支持的。
可动画:是。
注意: 每个额外八度对最终图像中的颜色和alpha值的贡献是前一个八度的一半。在某些情况下,额外八度的贡献可能小于给定颜色深度的颜色分辨率。用户代理可能会在处理期间根据支持的颜色深度限制numOctaves的指定值。(例如:对于每通道8位的颜色深度,用户代理可能将numOctaves值限制为9。)
seed
= "<number>"-
伪随机数生成器的起始数字。
将seed数字传递给上述算法时,必须首先截断,即四舍五入到最接近的整数值(向零取整)。
可动画:是。
stitchTiles
= "stitch | noStitch"-
如果
stitchTiles="noStitch"
,则不尝试在包含湍流函数的图块边界处实现平滑过渡。有时结果会在图块边界处显示明显的不连续性。如果
stitchTiles="stitch"
,则用户代理将自动调整baseFrequency-x和baseFrequency-y值,使feTurbulence节点的宽度和高度(即当前子区域的宽度和高度)包含第一个八度的Perlin图块宽度和高度的整数倍。基础频率将根据相对(而非绝对)变化最小的方式进行调整:初始值为 stitchTiles 为 noStitch。
可动画:是。
type
= "fractalNoise | turbulence"-
指示滤镜原语应执行噪声或湍流函数。
可动画:是。
< 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示例
10. color-interpolation-filters 属性
关于 color-interpolation-filters 属性的描述如下:
名称: | color-interpolation-filters |
---|---|
值: | auto | sRGB | linearRGB |
初始值: | linearRGB |
应用于: | 所有 filter primitive |
是否继承: | 是 |
百分比: | n/a |
计算值: | 按指定值 |
标准顺序: | 符合语法 |
媒体: | 视觉 |
可动画: | 否 |
- auto
-
表示用户代理可以在 sRGB 或 linearRGB 颜色空间中选择过滤效果的颜色操作。这个选项表明作者不要求颜色操作必须在特定颜色空间中进行。
- sRGB
-
表示过滤效果的颜色操作应在sRGB颜色空间中进行。
- linearRGB
-
表示过滤效果的颜色操作应在线性RGB颜色空间中进行。
color-interpolation-filters 属性指定通过过滤效果进行成像操作时所用的颜色空间。
注意: color-interpolation-filters 属性仅影响过滤操作。因此,它对诸如 feOffset、feImage、feTile 或 feFlood 等过滤基元没有影响。
注意: color-interpolation-filters 的初始值不同于 color-interpolation。color-interpolation-filters 的初始值为 linearRGB,而 color-interpolation 的初始值为 sRGB。因此,在默认情况下,过滤效果操作发生在linearRGB颜色空间,而所有其他颜色插值操作默认发生在sRGB颜色空间。
注意: color-interpolation-filters 属性不影响 Filter Functions,它们在sRGB颜色空间中操作。
color-interpolation-filters 属性是SVG元素的 表现属性。
11. 光源元素和属性
11.1. 简介
以下部分定义了用于定义 光源 的元素,如 feDistantLight、fePointLight 和 feSpotLight,以及定义光颜色的属性 lighting-color。
11.2. 光源 feDistantLight
名称: | feDistantLight
|
---|---|
类别: | 光源 |
内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
DOM 接口: | SVGFEDistantLightElement |
属性定义:
azimuth
= "<number>"-
光源在XY平面上的方向角(顺时针),以与x轴的角度表示,单位为度。
azimuth 的初始值为 0。
可动画:是。
elevation
= "<number>"-
光源从XY平面向Z轴方向的角度,单位为度。请注意,正Z轴指向观众。
elevation 的初始值为 0。
可动画:是。
下图说明了在XYZ坐标系中 azimuth 和 elevation 所表示的角度。
方位角和仰角所代表的角度
11.3. 光源 fePointLight
名称: | fePointLight
|
---|---|
类别: | 光源 |
内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
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
|
---|---|
类别: | 光源 |
内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
属性: | |
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 对于 feSpotLight 和 feSpecularLighting 中的 feSpecularLighting 用途不同。
可动画:是。
limitingConeAngle
= "<number>"-
限制光源投射区域的锥形限制器。锥形以外的区域不会投射光线。limitingConeAngle 代表聚光灯轴(即光源与其指向的点之间的轴线)与聚光灯锥之间的角度,单位为度。用户代理应该在锥体边界处应用平滑技术,例如抗锯齿。
如果未指定值,则不会应用锥形限制。
可动画:是。
11.5. 照明颜色 lighting-color 属性
名称: | lighting-color |
---|---|
值: | <color> |
初始值: | white |
适用于: | feDiffuseLighting 和 feSpecularLighting 元素 |
是否继承: | no |
百分比: | n/a |
计算值: | 如指定 |
语法顺序: | 按语法 |
媒体类型: | 视觉 |
是否可动画: | 按计算值 动画 |
lighting-color 属性定义了过滤器原语 feDiffuseLighting 和 feSpecularLighting 元素的光源颜色。
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-image、box-shadow、text-shadow 和 outline。此外,如果简写过滤器扩大了这个可见区域,比如 <blur()> 或 <drop-shadow()> 的情况,过滤区域也必须覆盖这些区域。
14. 过滤器的动画
14.1. 过滤函数列表的插值
对于从一个过滤器到第二个过滤器的插值,必须运行以下列表中与第一个匹配条件相对应的步骤:
- 如果两个过滤器都有相同长度的<filter-value-list>,且没有 <url>,并且每个<filter-function>在每个列表中都有相应项
- 根据过滤函数的插值部分的规则,插值每对<filter-function>。
- 如果两个过滤器都有不同长度的<filter-value-list>,且没有<url>,并且每个<filter-function>在每个列表中都有相应项
-
- 将缺失的<filter-function>等效项从较长的列表末尾附加到较短的列表中。新添加的<filter-function>必须初始化为插值的初始值。
- 根据过滤函数的插值部分的规则,插值每对<filter-function>。
- 如果一个过滤器为 none,另一个为没有 <url> 的 <filter-value-list>
-
- 将 none 替换为另一个过滤器的对应 <filter-value-list>。新的<filter-function>必须初始化为插值的初始值。
- 根据过滤函数的插值部分的规则,插值每对<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’。
< 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. 累积
给定两个过滤器值 Va 和 Vb,返回过滤器值 Vb。
15. 隐私和安全考量
15.1. 污染的过滤原语
重要的是,任何过滤操作的时间必须与从过滤内容或其他可能包含隐私敏感信息的来源获得的像素值无关。
以下过滤原语可能会访问包含隐私敏感信息的像素值,无论是来自过滤对象本身,还是来自如 CSS 样式的其他来源。这些原语必须被标记为“污染”。
-
feFlood 当 指定值的 flood-color 属性计算为 currentColor 时,
-
feDropShadow 当 指定值的 flood-color 属性计算为 currentColor 时,
-
feDiffuseLighting,当 指定值的 lighting-color 属性计算为 currentColor 时,
-
feSpecularLighting 当 指定值的 lighting-color 属性计算为 currentColor 时,
-
以下过滤原语:SourceGraphic、SourceAlpha、BackgroundImage、BackgroundAlpha、FillPaint 和 StrokePaint。
feFlood,feDropShadow,feDiffuseLighting 和 feSpecularLighting 是具有一个或多个 CSS 属性的原语,这些属性将 <color> 作为属性值。 <color> 包含(其中之一)currentColor 关键字。currentColor 的 已用值 源自 color 属性。由于 color 可以通过 :visited 伪类选择器进行设置,它可能包含隐私敏感信息,因此这些原语必须被标记为污染。
feImage 可以引用跨域图像以及文档片段,例如 SVG 图形元素。这些引用可能包含隐私敏感信息,因此该原语必须被标记为污染。
过滤原语 SourceGraphic,SourceAlpha,BackgroundImage,BackgroundAlpha,FillPaint 和 StrokePaint 参考了文档片段,例如 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,只读in2
, 类型为 SVGAnimatedString,只读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 ;
- 属性:
-
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 Selectorsconst 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 Operatorsconst 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,只读dx
, 类型为 SVGAnimatedNumber,只读dy
, 类型为 SVGAnimatedNumber,只读
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,只读
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日工作草案以来,进行了以下重要更改:
-
编辑改动。
-
向所有元素的内容模型中添加描述元素。
-
澄清了crossorigin属性不可动画化。
-
<hue-rotate()>接受无单位的零。
-
允许作者改变<color>和<length>值的顺序。更改语法以首先放置 <color>。区分插值的初始值和省略值的默认值。
-
定义CSS属性的动画类型。
-
当未满足前提条件时,使feColorMatrix和feConvolveMatrix成为传递元素。
-
使feTurbulence算法尊重一致性。
-
将适用于所有图形元素的属性应用于use元素。
-
修正了<saturate()>的滤镜表示。
-
扩展SVG DOM中的SVGFEBlendElement枚举以包含新的混合模式。
自2013年11月26日工作草案以来,进行了以下重要更改:
-
移除了自定义滤镜。
-
允许script元素在所有内容模型中使用。
-
支持CSS Blending规范中的所有混合模式,适用于feBlend。
-
支持CSS Blending规范中未重复的所有组合模式,适用于feComposite。
-
为feBlend添加了no-composite属性,以避免重复组合。
-
修正了简写语法的错误。
-
为简写滤镜区域添加了定义。
自2012年10月25日工作草案以来,进行了以下重要更改:
-
修正了亮度简写滤镜。
-
为自定义滤镜函数引入了新语法。
-
为自定义滤镜添加了at-function规则。
-
允许自定义滤镜函数作为未来滤镜功能的扩展。
-
移除了着色器上的不必要的属性和统一变量。
-
将着色器坐标空间的原点重新定义为左下角。
-
移除了现已不必要的滤镜边距属性。
有关更详细和长期的更改,请参阅变更日志。
致谢
编辑们要感谢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对其细致的审查、评论和纠正表示感谢。