【发布时间】:2018-03-10 00:00:24
【问题描述】:
我有一个 SVG <filter>,它使用 <feTurbulence> 创建如下纹理:
我通过在<feTurbulence> 中使用较大的 X 基频和较小的 Y 频率来创建这样的垂直纹理。我可以反过来做同样的技巧来获得水平纹理。但我真的很想能够创建一个对角线纹理,像这样:
但我不知道如何在过滤器中旋转<feTurbulence> 的输出。
我考虑了一个相当笨拙的解决方法:我可以创建一个比我的目标图像更大的图像,用垂直纹理填充它,将图像旋转到我想要的角度,然后将其裁剪以适合我的目标图像。但我肯定希望有更直接的方法来做到这一点!
编辑:根据要求,垂直纹理过滤器(在 d3.js 代码中,但应该很明显)。这是改编自 Inkscape 中的胶片颗粒过滤器:
filter = mapParams.defs
.append('filter')
.attr('x', '0%')
.attr('y', '0%')
.attr('width', '100%')
.attr('height', '100%')
.attr('filterUnits', 'objectBoundingBox')
.attr('id', 'TreeTexture');
filter.append('feTurbulence')
.attr('type', 'fractalNoise')
.attr('baseFrequency', '1 0.1')
.attr('numOctaves', '3')
.attr('result','fpr1');
// De-saturate to B&W
filter.append('feColorMatrix')
.attr('type', 'saturate')
.attr('values','0.0')
.attr('result', 'fpr2')
.attr('in','fpr1');
filter.append('feComposite')
.attr('operator', 'arithmetic')
.attr('in','SourceGraphic')
.attr('in2','fpr2')
.attr('k1', '0')
.attr('k2', '1')
.attr('k3', '1.5')
.attr('k4', '-0.4')
.attr('result', 'fpr3');
filter.append('feColorMatrix')
.attr('type', 'saturate')
.attr('values','0.85')
.attr('result', 'fpr4')
.attr('in','fpr3');
filter.append('feBlend')
.attr('mode', 'normal')
.attr('in','fpr4')
.attr('in2','SourceGraphic')
.attr('result', 'fpr5');
filter.append('feComposite')
.attr('operator', 'in')
.attr('in','fpr5')
.attr('in2','SourceGraphic')
.attr('result', 'fpr6');
编辑:为了澄清(因为它与 Michael Mullany 在下面发布的倾斜解决方案相关),我想将此过滤器应用于具有任意填充的对象。所以它可能被应用到一个绿色的物体上,如这里所示,但也可能被应用到红色的物体上,等等。
【问题讨论】:
-
你试过
.attr("transform", "rotate(45)")做最后的选择吗? -
@pmkro:transform 在
<feTurbulence>或<filter>上不执行任何操作。如果我把它放在填充的对象本身上,整个对象都会旋转,而不仅仅是纹理。 -
嗯,好吧。我在这个周围找到了一些documentation。也许试试
direction属性。 -
@pmkro:
direction属性对feTurbulence或filter都不起作用。
标签: d3.js svg svg-filters