【问题标题】:SVG feOffset filter enlarge/scaleSVG feOffset 过滤器放大/缩放
【发布时间】:2016-05-20 15:37:12
【问题描述】:

要在 svg 多边形或圆形上进行两次笔触和模糊处理,我创建了一个过滤器来执行此操作,尽管第二个“笔触”(使用过滤器创建)被剪裁或不像一个完美的圆形。知道如何以正确的方式解决这个问题吗?

<svg height="500" width="400">
  <defs>
    <filter id="select-highlight" width="200%" height="200%" x="-50%" y="-50%">
      <feOffset in="SourceGraphic" dx="0" dy="0" result="offset"></feOffset>
      <feMorphology in="offset" result="offsetmorph" operator="dilate" radius="2"></feMorphology>
      <feFlood flood-color="white"></feFlood>
      <feComposite operator="in" in2="offsetmorph" result="stroke"></feComposite>
      <feGaussianBlur stdDeviation="5" result="offsetblur"></feGaussianBlur>
      <feFlood flood-color="#4881D7"></feFlood>
      <feComposite operator="in" in2="offsetblur" result="blur"></feComposite>
      <feMerge>
        <feMergeNode in="blur"></feMergeNode>
        <feMergeNode in="stroke"></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
  </defs>
  <g transform="translate(50,50) scale(3)">
    <polygon points=" 22,0
                      44,10
                      44,34
                      22,44
                      0,34
                      0,10" fill="#e6a6d5" stroke="#4881D7" stroke-width="2" filter="url(#select-highlight)"></polygon>
  </g>
  <g transform="translate(50,250) scale(3)">
    <circle cx="22" cy="22" r="22" fill="#b6ccef" stroke="#4881D7" stroke-width="2" filter="url(#select-highlight)"></circle>
  </g>
</svg>

【问题讨论】:

    标签: javascript svg scale svg-filters


    【解决方案1】:

    feMorphology 在执行扩张时使用方形搜索框,因此它会创建此类剪裁效果。另一种扩张形状保留原始形状的方法是进行高斯模糊,然后使用 feComposite/feFuncA/table 将模糊区域转换为完全不透明的形状。像这样:

    <svg height="500" width="400" color-interpolation-filters="sRGB">
      <defs>
    <filter id="select-highlight" width="200%" height="200%" x="-50%" y="-50%" filterRes="1000">
      <feOffset in="SourceGraphic" dx="0" dy="0" result="offset"></feOffset>
      
      <feGaussianBlur stdDeviation="2" />
      <feComponentTransfer result="offsetmorph">
        <feFuncA type="table" tableValues="0 .05 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"/>
      </feComponentTransfer>
      <feFlood flood-color="white"></feFlood>
      <feComposite operator="in" in2="offsetmorph" result="stroke"></feComposite>
      <feGaussianBlur stdDeviation="5" result="offsetblur"></feGaussianBlur>
      <feFlood flood-color="#4881D7"></feFlood>
      <feComposite operator="in" in2="offsetblur" result="blur"></feComposite>
      <feMerge>
        <feMergeNode in="blur"></feMergeNode>
        <feMergeNode in="stroke"></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
      </defs>
      <g transform="translate(50,50) scale(3)">
    <polygon points=" 22,0
                      44,10
                      44,34
                      22,44
                      0,34
                      0,10" fill="#e6a6d5" stroke="#4881D7" stroke-width="2" filter="url(#select-highlight)"></polygon>
      </g>
      <g transform="translate(50,250) scale(3)">
    <circle cx="22" cy="22" r="22" fill="#b6ccef" stroke="#4881D7" stroke-width="2" filter="url(#select-highlight)"></circle>
      </g>
    </svg>

    【讨论】:

    • 谢谢,在 Chrome 上运行良好,但在 Firefox 上确实像素化了。知道为什么吗?
    • 看起来 Firefox 正在对 gamma 的指数进行地板或天花板近似。我将其更改为表格类型,现在它在两种浏览器中看起来都不错。 (我还为插值添加了 sRGB 颜色空间。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 2019-05-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2014-06-07
    • 2013-06-22
    相关资源
    最近更新 更多