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 属性引用 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 元素也不会被直接渲染,并且即使 filter 元素或其任何祖先上的 display 属性被设置为 none,filter 元素仍可供引用。
8. 滤镜区域
filter 元素 可以在画布上定义一个给定滤镜效果所应用的 滤镜 区域,并且可以为用于处理任何基于栅格的滤镜基元的任何中间连续色调图像提供分辨率。filter 元素具有以下属性,这些属性共同 定义滤镜区域:
- filterUnits
-
如果 filterUnits 等于 userSpaceOnUse,则 x、y、width、height 表示在引用 filter 元素时所采用的当前用户坐标系中的值(即通过 filter 属性引用 filter 元素的元素所使用的用户坐标系)。
如果 filterUnits 等于 objectBoundingBox,那么 x、y、width、height 表示引用元素的边界框的分数或百分比(参见对象边界框单位)。
filterUnits 的初始值为 objectBoundingBox。
可动画:是。
- x, y, width, height
-
这些属性定义画布上此滤镜所应用的一个矩形区域。
这些属性的坐标系取决于属性 filterUnits 的值。
该矩形的边界作为给定 filter 元素中所包含的每个滤镜基元的硬裁剪区域;因此,如果给定滤镜 基元的效果会延伸到矩形边界之外(使用具有非常大的 stdDeviation 的 feGaussianBlur 滤镜基元时有时会发生这种情况),效果的部分 内容将被裁剪。
引用该滤镜的元素的 ng。
可动画:是。
注: filterUnits 的两个可能值(即 objectBoundingBox 和 userSpaceOnUse)都会产生一个滤镜区域,其 坐标系的 X 轴和 Y 轴分别与将应用该滤镜的元素的局部坐标系的 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 坐标。参见滤镜基元子区域。
可动画:是。
y= "<length-percentage>"-
限制给定滤镜 基元计算和渲染的子区域的最小 y 坐标。参见滤镜基元子区域。
可动画:是。
width= "<length-percentage>"-
限制给定滤镜 基元计算和渲染的子区域的宽度。参见滤镜基元子区域。
负值或零值会禁用给定滤镜基元的效果(即结果为 透明黑色图像)。
可动画:是。
height= "<length-percentage>"-
限制给定滤镜 基元计算和渲染的子区域的高度。参见滤镜基元子区域。
负值或零值必须禁用给定滤镜基元的效果(即结果为 透明黑色图像)。
可动画:是。
result= "<filter-primitive-reference>"-
<filter-primitive-reference> 是一个 <custom-ident> [CSS3VAL],并且是分配给此滤镜基元的名称。如果提供了该值,则 处理此滤镜 基元所产生的图形可以由同一 filter 元素中后续滤镜 基元上的 in 属性引用。如果未提供值,则输出 仅在下一个滤镜基元未为其 滤镜基元的 in 属性提供值时,才可作为其隐式输入重新使用。
大多数滤镜基元都以其他滤镜基元作为输入。以下属性代表 所有用于引用其他滤镜基元的输入属性:
属性定义:
in= "SourceGraphic | SourceAlpha | BackgroundImage | BackgroundAlpha | FillPaint | StrokePaint | <filter-primitive-reference>"-
标识给定滤镜基元的输入。该值可以是六个关键字之一,也可以 是一个与同一 filter 元素中先前某个 result 属性值匹配的字符串。 如果未提供值,并且这是第一个滤镜基元,那么该滤镜基元将使用 SourceGraphic 作为输入。如果未 提供值,并且这是后续滤镜基元, 那么该滤镜基元将使用前一个 滤镜基元的结果作为输入。
如果 result 的值在给定 filter 元素中出现多次,那么对该结果的引用将使用 前面距离最近且其属性 result 具有给定值的滤镜基元。
不允许对结果进行前向引用,并将按未指定结果处理。
对不存在结果的引用将按未指定结果处理。
六个关键字的定义:
SourceGraphic-
此关键字表示作为 filter 元素原始输入的图形元素。对于栅格效果滤镜 基元,图形元素将在图像空间中被栅格化到一个初始透明的 RGBA 栅格中。原始图形未触及的像素将保持透明。该 图像被规定以线性 RGBA 像素进行渲染。此图像的 alpha 通道 会捕获 SVG 指定的任何抗锯齿效果。(由于该栅格是线性的,此图像的 alpha 通道 将表示每个像素的精确覆盖百分比。)
SourceAlpha-
此关键字表示作为 filter 元素原始输入的图形元素。SourceAlpha 与 SourceGraphic 遵循完全相同的规则,只是仅使用 alpha 通道。输入图像是一个 RGBA 图像,其中 RGB 通道 隐式使用黑色值,而其 alpha 通道与 SourceGraphic 相同。
注: 如果使用此选项,那么某些实现 可能需要将图形元素栅格化,以提取 alpha 通道。
BackgroundImage-
此关键字表示调用 filter 元素时,由当前隔离组在滤镜区域 后方定义的背景。参见 isolation 属性 [COMPOSITING-1]。
BackgroundAlpha-
与 BackgroundImage 相同,只是仅使用 alpha 通道。参见 SourceAlpha 和 isolation 属性 [COMPOSITING-1]。
FillPaint-
此关键字表示滤镜效果目标元素上的 fill 属性的值。FillPaint 图像在概念上具有无限 范围。通常此图像处处不透明,但如果“绘制” 本身具有 alpha,则可能并非如此,例如渐变或图案本身包含透明 或半透明部分的情况。如果 fill 引用绘制服务器,那么绘制服务器的坐标空间就是为被滤镜对象定义的坐标 空间。例如,如果绘制服务器要求使用对象的 objectBoundingBox, 则被滤镜对象的对象边界框定义绘制服务器的参考尺寸。 如果绘制服务器要求使用 userSpaceOnUse,则被滤镜对象的局部坐标系中最近的视口 定义绘制服务器的参考尺寸。
StrokePaint-
此关键字表示滤镜效果目标元素上的 stroke 属性的值。StrokePaint 图像在概念上具有 无限范围。更多详细信息请参见上面的 FillPaint。
9.3. 滤镜原语树
没有滤镜基元输入或只有一个滤镜基元输入的滤镜基元可以链接在一起形成滤镜链。例如,包含两个或更多 <filter-function> 的 <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 >
上述滤镜有 2 棵滤镜基元树,包含以下滤镜基元:
-
feColorMatrix、feOffset 和 feGaussianBlur(其中 feGaussianBlur 是该树的根滤镜 基元),以及
-
feFlood 和 feComposite(其中 feComposite 是该树的根滤镜基元)。
两棵滤镜基元树彼此不连接。只有第 2 棵,即主滤镜基元树 参与滤镜处理。实现可以忽略第一棵树。
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>"-
“Compositing and Blending Level 1” [COMPOSITING-1] 中定义的混合模式之一,其中输入 in 表示源
Cs, 第二个输入 in2 表示背景Cb。此滤镜基元的输出Cm是将Cs与Cb混合的结果。可动画:是。
no-composite= "no-composite"-
如果存在 no-composite 属性,则 指定的混合模式不得应用 alpha 合成。有关不带合成的“混合”公式,请参见 混合 [COMPOSITING-1]。 否则,实现必须将 mode 指定的混合模式与 Source Over 合成运算符组合。有关带合成的“混合”公式,请参见 混合 [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 元素的处理:
-
如果指定了多个同类的传递函数元素, 则使用最后出现的那个。
-
如果有任何传递函数元素未指定,则必须将 feComponentTransfer 按照这些 传递函数元素已被指定且其 type 属性设置为 identity 的方式进行处理。
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 运算符如上所述。
可动画:是。
k1= "<number>"-
仅当
operator="arithmetic"时适用。可动画:是。
k2= "<number>"-
仅当
operator="arithmetic"时适用。可动画:是。
k3= "<number>"-
仅当
operator="arithmetic"时适用。可动画:是。
k4= "<number>"-
仅当
operator="arithmetic"时适用。可动画:是。
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 开销,并且通常无法产生足以抵消 性能影响的结果。
可动画:是。
kernelMatrix= "<list of numbers>"-
构成卷积核矩阵的 <number> 列表。 各值由空格字符和/或逗号分隔。列表中的条目数量 必须等于 <orderX> 乘以 <orderY>。
如果
orderX * orderY的结果不等于值 列表中的条目数量,则滤镜基元充当直通滤镜。当值列表中的 条目数量无效时应如何处理?<https://github.com/w3c/csswg-drafts/issues/237>
可动画:是。
divisor= "<number>"-
将 kernelMatrix 应用于输入图像 得到一个数字后,该数字再除以 divisor,从而得到最终的 目标颜色值。等于矩阵中所有值之和的除数往往会对结果的整体颜色强度 产生均衡作用。如果指定的除数为 0,则改用默认值。
初始值是 kernelMatrix 中所有值之和,但有一个例外: 如果其总和为零,则将除数设为 1。
可动画:是。
bias= "<number>"-
将 kernelMatrix 应用于输入图像 得到一个数字并应用 divisor 后,会将 bias 属性添加到每个 分量中。bias 的一种用途,是希望让 .5 灰度值成为 滤镜的零响应时。bias 属性会平移滤镜的范围。这允许表示原本 会被钳制为 0 或 1 的值。
可动画:是。
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×M 图像,其中 m=M-1 且 n=N-1:
使用 duplicate 扩展两个像素:
wrap 表示通过 获取图像相对边缘的颜色值来扩展输入图像。
使用 wrap 扩展两个像素:
值 none 表示使用 R、G、B 和 A 均为零的像素值 扩展输入图像。
可动画:是。
kernelUnitLength= "<number-optional-number>"-
第一个数字是 <dx> 值。第二个数字是 <dy> 值。如果未指定 <dy> 值, 则其默认值与 <dx> 相同。它分别指示 kernelMatrix 中连续 列和行之间以当前滤镜单位表示的预期距离(即由属性 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可动画:是。
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> 相同。它分别表示表面法线 计算公式中
dx和dy以当前滤镜单位表示的预期距离(即由属性 primitiveUnits 的值确定的单位)。通过为 kernelUnitLength 指定值, 卷积核便会在可缩放的抽象坐标系中定义。如果未指定 kernelUnitLength, 则dx和dy值应表示相对于给定(x,y)位置的非常小的增量, 在某些情况下,这可能实现为中间图像离屏位图中的一个 像素,而该位图使用基于像素的坐标系,因此可能无法缩放。为了在不同显示媒介和用户代理之间获得 一定程度的一致性,有必要为 kernelUnitLength 提供一个值。如果指定了负值或零值,则改用默认值。
注: 此属性已弃用,并将被移除。它 无法提供一种可靠的方法来创建与平台无关的结果。本规范的未来版本 将涵盖此用例。
可动画:是。
光源由 子元素 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 属性在 filter 元素上建立的坐标系来表示。
当此属性的值为 0 时,此操作对 源图像没有影响。
可动画:是。
xChannelSelector= "R | G | B | A"-
指示使用 in2 中的哪个通道,沿 x 轴置换 in 中的像素。
xChannelSelector 的初始值为 A。
可动画:是。
yChannelSelector= "R | G | B | A"-
指示使用 in2 中的哪个通道,沿 y 轴置换 in 中的像素。
yChannelSelector 的初始值为 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 通道,以及 feDropShadow 上的 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 的结果进行合成,就像应用了一个带有
operator="in"的 feComposite 滤镜 基元一样:< 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 |
此滤镜基元引用此 filter 元素外部的图形,该图形会被加载或渲染到 RGBA 栅格中,并成为该滤镜基元的结果。
此滤镜基元可以引用外部图像,也可以引用 SVG 的另一部分。它 生成的图像类似于内置图像源 SourceGraphic, 不同之处在于该图形来自外部源。
如果 href 引用了独立的图像资源,例如 JPEG、PNG 或 SVG 文件,则按照 image 元素的行为渲染该图像资源;否则,按照 use 元素的行为渲染所引用的资源。在任一情况下,当前用户坐标系都取决于 filter 元素上的属性 primitiveUnits 的值。 feImage 元素上的 preserveAspectRatio 属性的处理方式 与 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))。
注: 此滤镜基元生成的图像包含光照计算中的 镜面反射部分。这种映射旨在使用 arithmetic feComposite 方法的 add 项,与来自第二个滤镜基元的纹理 进行组合。在将其应用于纹理图像之前,可以通过叠加多个这样的光照映射来模拟多个光源。
生成的 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 轴起算的度数表示。
可动画:是。
elevation= "<number>"-
光源从 XY 平面朝向 Z 轴的方向角,以度数表示。请注意, 正 Z 轴指向观察者。
可动画:是。
下图说明了在XYZ坐标系中 azimuth 和 elevation 所表示的角度。
方位角和仰角所代表的角度
11.3. 光源 fePointLight
| 名称: | fePointLight
|
|---|---|
| 类别: | 光源 |
| 内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
| 属性: | |
| DOM 接口: | SVGFEPointLightElement |
属性定义:
x= "<number>"-
光源在由 filter 元素上的 primitiveUnits 属性建立的坐标系中的 X 位置。
可动画:是。
y= "<number>"-
光源在由 filter 元素上的 primitiveUnits 属性建立的坐标系中的 Y 位置。
可动画:是。
z= "<number>"-
光源在由 filter 元素上的 primitiveUnits 属性建立的坐标系中的 Z 位置,假定在初始局部坐标系中,正 Z 轴朝向查看内容的人延伸, 并假定沿 Z 轴的一个单位等于 X 和 Y 中的一个单位。
可动画:是。
11.4. 光源 feSpotLight
| 名称: | feSpotLight
|
|---|---|
| 类别: | 光源 |
| 内容模型: | 任何数量的 描述性元素,animate,script,set 元素,顺序不限。 |
| 属性: | |
| DOM 接口: | SVGFESpotLightElement |
属性定义:
x= "<number>"-
光源在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 X 位置。
可动画:是。
y= "<number>"-
光源在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 Y 位置。
可动画:是。
z= "<number>"-
光源在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 Z 位置,假定在初始局部坐标系中,正 Z 轴朝向查看内容的人延伸, 并假定沿 Z 轴的一个单位等于 X 和 Y 中的一个单位。
可动画:是。
pointsAtX= "<number>"-
光源所指向点在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 X 位置。
可动画:是。
pointsAtY= "<number>"-
光源所指向点在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 Y 位置。
可动画:是。
pointsAtZ= "<number>"-
光源所指向点在由 primitiveUnits 属性在 filter 元素上建立的坐标系中的 Z 位置,假定在初始局部坐标系中,正 Z 轴朝向查看内容的人延伸, 并假定沿 Z 轴的一个单位等于 X 和 Y 中的一个单位。
可动画:是。
specularExponent= "<number>"-
控制光源聚焦程度的指数值。
specularExponent 的初始值为 1。
有关如何使用 specularExponent,请参见滤镜基元 <feDiffuseLighting>一节。
注: specularExponent 在 feSpotLight 中的用途与 specularExponent 在 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 >
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, readonly-
对应于给定 filter 元素上的 filterUnits 属性。取 SVGUnitTypes 中定义的常量之一。
primitiveUnits, 类型为 SVGAnimatedEnumeration, readonly-
对应于给定 filter 元素上的 primitiveUnits 属性。取 SVGUnitTypes 中定义的常量之一。
x, 类型为 SVGAnimatedLength, readonlyy, 类型为 SVGAnimatedLength, readonlywidth, 类型为 SVGAnimatedLength, readonlyheight, 类型为 SVGAnimatedLength, readonly
接口 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, 类型为 SVGAnimatedString, readonly-
对应于给定 feComposite 元素上的 in 属性。
in2, 类型为 SVGAnimatedString, readonly-
对应于给定 feComposite 元素上的 in2 属性。
operator, 类型为 SVGAnimatedEnumeration, readonly-
对应于给定 feComposite 元素上的 operator 属性。
k1, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feComposite 元素上的 k1 属性。
k2, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feComposite 元素上的 k2 属性。
k3, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feComposite 元素上的 k3 属性。
k4, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feComposite 元素上的 k4 属性。
接口 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, readonly-
对应于给定 feConvolveMatrix 元素上的 in 属性。
orderX, 类型为 SVGAnimatedInteger, readonly-
对应于给定 feConvolveMatrix 元素上的 order 属性。
orderY, 类型为 SVGAnimatedInteger, readonly-
对应于给定 feConvolveMatrix 元素上的 order 属性。
kernelMatrix, 类型为 SVGAnimatedNumberList, readonly-
对应于给定 feConvolveMatrix 元素上的 kernelMatrix 属性。
divisor, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feConvolveMatrix 元素上的 divisor 属性。
bias, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feConvolveMatrix 元素上的 bias 属性。
targetX, 类型为 SVGAnimatedInteger, readonly-
对应于给定 feConvolveMatrix 元素上的 targetX 属性。
targetY, 类型为 SVGAnimatedInteger, readonly-
对应于给定 feConvolveMatrix 元素上的 targetY 属性。
edgeMode, 类型为 SVGAnimatedEnumeration, readonly-
对应于给定 feConvolveMatrix 元素上的 edgeMode 属性。
kernelUnitLengthX, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feConvolveMatrix 元素上的 kernelUnitLength 属性。
kernelUnitLengthY, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feConvolveMatrix 元素上的 kernelUnitLength 属性。
preserveAlpha, 类型为 SVGAnimatedBoolean, readonly-
对应于给定 feConvolveMatrix 元素上的 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, readonly-
对应于给定 feDropShadow 元素上的 in 属性。
dx, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feDropShadow 元素上的 dx 属性。
dy, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feDropShadow 元素上的 dy 属性。
stdDeviationX, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feDropShadow 元素上的 stdDeviation 属性。包含属性 stdDeviation 的 X 分量。
stdDeviationY, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feDropShadow 元素上的 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, readonly-
对应于给定 feGaussianBlur 元素上的 in 属性。
stdDeviationX, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feGaussianBlur 元素上的 stdDeviation 属性。包含属性 stdDeviation 的 X 分量。
stdDeviationY, 类型为 SVGAnimatedNumber, readonly-
对应于给定 feGaussianBlur 元素上的 stdDeviation 属性。包含属性 stdDeviation 的 Y 分量。
edgeMode, 类型为 SVGAnimatedEnumeration, readonly-
对应于给定 feGaussianBlur 元素上的 edgeMode 属性。取此接口上定义的 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日工作草案以来,进行了以下重大更改。
-
编辑性更改。
-
将 description 元素添加到所有元素的内容模型中。
-
明确 crossorigin 不可动画。
-
<hue-rotate()> 接受无单位的零值。
-
允许作者更改 <color> 和 <length> 值在 <drop-shadow()> 中的顺序。更改语法,将 <color> 放在最前面。区分用于插值的初始值与省略值时所使用的默认值。
-
定义 CSS 属性的动画类型。
-
使 feColorMatrix 和 feConvolveMatrix 在前置条件未满足时充当直通滤镜。
-
使 feTurbulence 算法遵循一致性。
-
将适用于所有图形元素的属性也应用于 use 元素。
-
修正 <saturate()> 的滤镜基元表示。
-
使用新的混合模式扩展 SVG DOM SVGFEBlendElement 枚举。
自 2013年11月26日工作草案以来,进行了以下重大更改。
-
移除了自定义滤镜。
-
允许在所有内容模型中使用 script 元素。
-
为 feBlend 支持 CSS Blending 规范中的所有混合模式。
-
为 feComposite 支持 CSS Blending 规范中的所有非重复合成模式。
-
为 feBlend 添加 no-composite 属性,以避免重复合成。
-
修正简写语法。
-
添加简写滤镜区域的定义。
自 2012年10月25日工作草案以来,进行了以下重大更改。
-
修正 brightness 简写滤镜。
-
为自定义滤镜函数采用新语法。
-
为自定义滤镜添加 at-function 规则。
-
允许自定义滤镜函数用作未来滤镜功能的扩展。
-
移除着色器上不必要的属性和 uniform。
-
将着色器坐标空间的原点重新定义为左下角。
-
移除现已不再需要的 filter-margin 属性。
更详细的长期更改请参见 ChangeLog。
致谢
编辑们要感谢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对其细致的审查、评论和纠正表示感谢。