SVG过滤器使用feImage作为feDisplacementMap的输入[关闭]

Posted

技术标签:

【中文标题】SVG过滤器使用feImage作为feDisplacementMap的输入[关闭]【英文标题】:SVG Filter using feImage as input to feDisplacementMap [closed] 【发布时间】:2021-11-05 06:28:21 【问题描述】:

我正在尝试使用 svg 过滤器向图像添加置换贴图。这是我的代码:

<svg  >
    <filter id="a" filterUnits="userSpaceOnUse" x="0" y="0"  >
      <feImage xlink:href="https://i.imgur.com/TKNyL9Q.jpg" result="heatmap"/>
      <feDisplacementMap scale="15" xChannelSelector="R" yChannelSelector="G" in2="heatmap" in="SourceGraphic"/>
    </filter>
    <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/beagle400.jpg"   filter="url(#a)" />
  </svg>

这应该是获取小猎犬图像并对其应用网格置换贴图,但它没有效果。

奇怪的是,在&lt;feDisplacementMap&gt; 标记中将inin2 切换确实有效,但反过来显示带有小猎犬地图的网格图像很好。

这是一个codepen 示例。

为什么它只能以一种方式工作?

【问题讨论】:

我认为代码很好。您可以在 xChannelSelector | MDN 上看到类似的内容。我可以使这个过滤器工作的唯一方法是运行来自同一域的 all 文件。我正在运行 Firefox 91。 @chrwahl 谢谢。我已经在 Chrome 93.0.4577.63 上测试过,使用本地文件运行时没有区别。 听起来您直接从文件系统测试了文件。如果您的计算机上有这些文件,则需要使用 SVG/html 文件、feImage 和 beagle 图像运行 Web 服务器。 @chrwahl 哦,有趣的是,托管它确实可以解决它。谢谢 我认为知道文件必须在同一个域中,并且在本地测试时必须运行 Web 服务器,这些信息足以作为完整的答案。 @chrwahl 【参考方案1】:

似乎 in & in2 参数需要与源图形本身而不是 .heatmap 匹配。

我将第一个:“带有热图过滤器的 Beagle”修改为:

<feDisplacementMap scale="15" xChannelSelector="R" yChannelSelector="G" in2="SourceGraphic" in="SourceGraphic"/><!-- -->
    </filter>

让我知道这是否是您正在寻找的结果?

【讨论】:

感谢您的回答,但这不是我所追求的。您的代码使用小猎犬图像作为图像和置换贴图,但我想使用热图/网格图像作为置换贴图。

以上是关于SVG过滤器使用feImage作为feDisplacementMap的输入[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SVG 过滤器将白色图像反转为黑色?

我如何“裁剪” svg 以适应父母的形状?

使用 SVG 过滤器向 SVG 图像元素添加边框 [重复]

如何使用 svg 过滤器应用渐变

角度和 SVG 过滤器

带有 CSS 过渡的 SVG 过滤器