svg - 如何制作 svg 散点滤镜?

标签 svg svg-filters

我尝试将精确的形状变成一系列分散的点,这些点在源图像的中间具有更高的密度。

Example: White Circle on Black Background → Messier 92 (抱歉,我没有足够的声誉来嵌入图像)

因此,除圆形之外的形状仍应可识别。这是我能做到的最好的:

我将这种效果称为“分散”滤镜。请告诉我您是否有更好的名字。

<svg height='100' width='100'>
  <filter id="cluster" filterUnits="userSpaceOnUse">
    <feGaussianBlur in="SourceGraphic" result='blurred' stdDeviation="10" />
    <feTurbulence type="turbulence" baseFrequency="9" numOctaves="4" result="turbulence" /> 
    <feDisplacementMap in2="turbulence" in="blurred" scale="10" xChannelSelector="R" yChannelSelector="G"  />
  </filter>
  <rect x='0' y='0' height='100' width='100' fill='black' />
  <circle cx='50' cy='50' fill='white' r='30' filter='url(#cluster)' />
</svg>

这基本上是一个奇特的模糊。随着 feDisplacementMap比例的增加,结果看起来更好。

<svg height='100' width='100'>
  <filter id="cluster" filterUnits="userSpaceOnUse">
    <feGaussianBlur in="SourceGraphic" result='blurred' stdDeviation="10" />
    <feTurbulence type="turbulence" baseFrequency="9" numOctaves="4" result="turbulence" /> 
    <feDisplacementMap in2="turbulence" in="blurred" scale="50" xChannelSelector="R" yChannelSelector="G"  />
  </filter>
  <rect x='0' y='0' height='100' width='100' fill='black' />
  <circle cx='50' cy='50' fill='white' r='30' filter='url(#cluster)' />
</svg>

但这也取代了图像。我可以撤消此操作吗?或者一开始就不做?也许使用 feDisplacementMap 以外的其他东西?

最佳答案

你的过滤器的主要问题是它的基频非常高 - 你需要把它调低。作为散射滤波器的 feTurbulence 类型,fractalNoise 比 turbulence 更好。只要您的位移贴图以​​ channel 的 0.5 为中心,您的图像平均不应在 x/y 方向上位移。如果您有明亮或黑暗的位移贴图(feTurbulence 则不是这种情况),这只是一个问题。最后 - 更高的位移比例将为您提供您正在寻找的尖锐外观 - 就像这样。

可能需要进行大量的试验和错误才能获得您想要的确切外观。这是阴影过滤器编辑器的链接,可能会给您一些想法 https://codepen.io/mullany/pen/sJopz

<svg height="220px" width="260px" viewBox="0 0 800 600">
  <defs>
    <filter id="scatter">
      <feTurbulence baseFrequency=".2" type="fractalNoise" numOctaves="3"/>
      <feDisplacementMap in="SourceGraphic" xChannelSelector="G" yChannelSelector="B" scale="300"/>
      <feComposite operator="in" in2="finalMask"/>
    </filter>
    </defs>
  
  <g filter="url(#scatter)">
  <polyline points="10,10  10,300, 300,400" transform="translate(60 60)" fill="blue"/>
  
  <polyline points="500,10  110,300, 300,400" transform="translate(260 60)" fill="red"/>
  </g>
</svg>

关于svg - 如何制作 svg 散点滤镜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53083647/

相关文章:

html - 应用 SVG 高斯模糊后 Div 消失

javascript - <div> 下面有高斯模糊

svg - 自重叠 svg 路径

javascript - 如何使用 JavaScript 或 CSS 动态更改 SVG 过滤器?

svg - 使用 SVG 使用混合过滤器(更具体地说是相乘)

css - 参数化和重用 HTML5 中定义的自定义 SVG 过滤器?

javascript - 尝试随机创建数据数组时出现未捕获的类型错误

javascript - Raphael 的 `getFont` 方法不起作用(?)

javascript - 不与 SVG 交互

javascript - jQuery:从具有多个节点的 HTML 字符串中提取最顶层的 SVG 元素