使用 SVG 滤镜将噪声应用于具有透明度的图像

Apply noise to image with transparency by use of SVG filters

我正在尝试对图像应用噪声效果,但是,我很难保持透明度。这里有一个fiddle来说明:

https://jsfiddle.net/t1aeyqfu/

#noisy {
  filter: url(#noise);
}

#filter {
  visibility: hidden;
}
<body style="background-color: #aca">
  <img src="https://i.postimg.cc/pr61qLqk/flower.png" id="noisy">
  <svg id="filter">
    <filter id="noise">
      <feTurbulence baseFrequency="0.60" xresult="colorNoise" />
      <feColorMatrix in="colorNoise" type="matrix" values=".33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0 0 0 0 1 0" result="monoNoise" />
      <feBlend in="SourceGraphic" in2="monoNoise" mode="multiply" />
    </filter>
  </svg>

</body>

我的目标是仅将噪声效果应用于图像中不透明的部分。 (在上面的例子中:蓝色花外没有噪音。)

我使用 feCompositeout 运算符有点接近,但噪声继承了透明度。将 SourceAlpha 应用于结果可能会有所帮助,但我不知道如何。

感谢您的提示!

您正在寻找的过滤器非常简单 feCompositeoperator="out"

#noisy {
  filter: url(#noise);
}

#filter {
  visibility: hidden;
}
<body style="background-color: #aca">
  <img src="https://i.postimg.cc/pr61qLqk/flower.png" id="noisy">
  <svg id="filter">
    <filter id="noise">
      <feTurbulence baseFrequency="0.20" xresult="colorNoise" />
      <feColorMatrix in="colorNoise" type="matrix" values=".33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0 0 0 0 1 0" result="monoNoise" />
      <feComposite operator="out" in="SourceGraphic" in2="monoNoise"/>
    </filter>
  </svg>

</body>

只需添加一个 feComposite/in 即可将噪音剪裁到原始形状。其余保持不变。

#noisy {
  filter: url(#noise);
}

#filter {
  visibility: hidden;
}
<body style="background-color: #aca">
  <img src="https://i.postimg.cc/pr61qLqk/flower.png" id="noisy">
  <svg id="filter">
    <filter id="noise">
      <feTurbulence baseFrequency="0.60" xresult="colorNoise" />
      <feColorMatrix in="colorNoise" type="matrix" values=".33 .33 .33 0 0 .33 .33 .33 0 0 .33 .33 .33 0 0 0 0 0 1 0"/>
      <feComposite operator="in" in2="SourceGraphic" result="monoNoise"/>
      <feBlend in="SourceGraphic" in2="monoNoise" mode="multiply" />
    </filter>
  </svg>

</body>