【问题标题】:Can we apply a SVG filter to a specific portion of canvas element?我们可以将 SVG 过滤器应用于画布元素的特定部分吗?
【发布时间】:2018-03-13 09:19:59
【问题描述】:

我正在研究 SVG 和滤镜,然后我有一个想法:我们可以将滤镜应用到元素的特定部分吗?

确切地说,看看:My home page

正方形在页面两侧的两个画布上绘制。现在,如您所见,主要内容下方有几个方块。我想让它们模糊一点,这样看起来更好。

我的想法: 仅将 SVG 模糊滤镜应用于主要内容正下方的画布部分。

感谢任何帮助!

【问题讨论】:

  • 如果您有关于 SVG 功能的具体问题,请创建minimal reproducible example 并将其包含在您的问题中。
  • 我现在无法检查您的页面,但您使用的是 html <canvas> 元素吗?如果不是,请删除您问题的画布标签。无论如何,之前的评论是对的。

标签: jquery canvas svg svg-filters


【解决方案1】:

2D 上下文filter 属性

您可以通过 2D 上下文过滤器属性将一些标准过滤器应用于画布。

ctx.filter = "blur(5px)"

过滤器应用于新呈现的内容,而不是现有内容。

ctx.fillRect(10,10,20,10); // not blurred

ctx.filter = "blur (5px)";
ctx.fillRect(10,30,20,10); //blurred but first rect remains unblurred

有一些内置过滤器。这些单位就像 CSS 一样,必须后固定。长度“px”,百分比“%”,度数“deg”

您还可以通过 url 使用 SVG 过滤器。我从未尝试过使用该方法,但假设我将涵盖所有可用的 SVG 过滤器。

当我第一次使用过滤器属性时,它非常慢。但现在我在动画中使用它们,因为性能越来越好。但请务必小心,因为它们尚未达到 CSS 和 SVG 的性能,通常是因为渲染管理技术。

画布过滤方法列表。

"url(url)" // url points to XML file containing SVG filter,
           // can be to anchor in SVG  to filter element.
"blur(length)"
"brightness(percentage)"
"contrast(percentage)"
"drop-shadow(offsetX, offsetY, blurRadius, color)"
"grayscale(percentage)"
'hue-rotate(degree)"
"invert(percentage)"
"opacity(percentage)"
"saturate(percentage)"
"sepia(percentage)"

*注意; filter 是实验性的,见 MDN 2D context filter

重新 SVG 过滤器url() 功能。来自 MDN 2017 年 9 月 15 日

  • url()。 url() 函数获取指定 SVG 过滤器的 XML 文件的位置,并且可能包含指向特定 过滤元件。

另见HTML Living Standard 4.12.5.1.19 Filters 2017 年 10 月 3 日

【讨论】:

  • 不确定问题是使用 canvas 作为 svg 图形的呈现区域还是真正作为 HTMLCanvas 元素,因此您可能回答错误。此外,url 指向 svgFilter 元素,而不是文件,即使此过滤器可以嵌入到外部文件中。您可能还想添加过滤器可以组合。
  • 不太确定我应该如何接受您的编辑...我会亲自接受并猜测您相信以前的错误 MDN 声明而不是我的更正,因此我将引导您了解规格:@ 987654323@
  • 这行得通。感谢您的回答!需要指出的是,blur和()之间不应该有空格
  • @Kaiido 在我的回答中重新编辑您评论的内容。我没有删除对 MDN 页面的引用(包含您的更新),使用 ctx.filter = "url(url)"; 对 MDN 的更新并没有更清晰。我添加了 MDN 引用来澄清我的释义描述。顺便说一句,我们指的是画布 2D 上下文并使用 SVG 过滤器进行渲染。我在编辑中提供了对正确规范的参考。
  • 我的编辑修正了一个错误,我也很高兴地指出了你:url(url) 是一个过滤器功能属性,是过滤器功能列表的一部分,必须指向定义 here 的 SVG 过滤器元素。您的链接定义了 CanvasRenderingContext2D#filter 属性,如果您点击那里的链接,您会发现我是对的。而且您在解释本文时忘记了一个重要部分:过滤器属性接受以下一个或多个过滤器函数
【解决方案2】:

您可以使用 feFlood 作为伪剪辑路径来过滤内容的子部分。过滤器窗口由 feFlood 中指定的尺寸定义。

    <svg>
      <defs>
      <filter id="partblur" primitiveUnits="objectBoundingBox">
        <feFlood x="0.1" y="0.1" width="0.2" height="0.35"/>
        <feComposite operator="in" in="SourceGraphic"/>
        <feGaussianBlur stdDeviation="5"/>
        <feComposite operator="over" in2="SourceGraphic"/>
      </filter>
      </defs>
    </svg>

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 2022-11-03
    • 1970-01-01
    相关资源
    最近更新 更多