【问题标题】:enlarged svg drop shadows放大的 svg 阴影
【发布时间】:2014-12-28 10:38:27
【问题描述】:

以下代码显示一个带有阴影的箭头。该要求要求使阴影略大于箭头,以便如果箭头是直的并且直接指向前方,则可以在箭头的任一侧看到等量的阴影。我尝试创建两个仅在水平位置上有所不同的阴影,但从未让它正常工作。

要求不模糊阴影,因此通过添加模糊来“放大”不是一种选择。图片不应该看起来很逼真。

我已经有代码可以创建放大的、垂直移动的、黑色的箭头副本。我希望有一个更完善的解决方案,因为那是很多代码和冗余数据。

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg id="785849135" width="960pt" height="720pt"
 viewBox="160 0 960 720"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
  <defs>
    <filter id='drop-shadow'>
      <!-- Shadow Offset -->
      <!-- EDIT: dx and dy to change the size of the shadow -->
      <feOffset     
        dx='-4'
        dy='4'
      />
      <!-- Shadow Blur -->
      <!-- EDIT: edit stdDeviation to change the shadow blurriness -->
      <!-- "0" is no blur -->
      <feGaussianBlur
        stdDeviation='0'
        result='offset-blur'
      />
      <!-- Color & Opacity -->
      <feFlood
        flood-color='black'
        flood-opacity='1'
        result='color'
      />      
      <!-- Clip color inside shadow -->
      <feComposite
        operator='in'
        in='color'
        in2='offset-blur'
        result='shadow'
      />      
      <!-- Put original object over shadow -->
      <feComposite
        operator='over'
        in='SourceGraphic'
        in2='shadow'
      />
    </filter>
    </defs>
      <g  filter='url(#drop-shadow)'>
        <path fill="#654114" stroke="#654114" stroke-width="0.0" d="M547.71777 390.23407 L 527.47506 392.82273 540.08449 392.79837 539.86309 393.17777 426.68945 586.88612 399.23955 630.62126 361.53130 686.78918 337.97979 720.00000 362.91010 720.00000 391.19683 720.00000 410.65441 686.73793 441.43435 630.48495 463.47400 586.70712 552.51368 393.15324 552.68787 392.77403 565.28519 392.74969 547.71777 390.23407 z"/>
      </g>
</svg>

【问题讨论】:

  • 最好包含一张你正在尝试做的事情的前后图像并将其附加到问题中。
  • Michael - 我要附加一个前文件,但后文件会很困难。我必须复制并放大箭头的 Java 代码是通过电子邮件发送给我的片段,我尚未将这些片段集成到程序中。
  • 这是上述代码的截屏。帽子和我所追求的唯一区别是扩大了阴影。 ![]jan2013.imghost.us/KJ/arrow.png
  • ![](jan2013.imghost.us/KJ/arrow.png)
    好吧,我放弃了,富文本编辑器没有出现,我的标记被忽略了。

标签: svg svg-filters


【解决方案1】:

这应该会产生你想要的(或者至少是我认为你想要的)。就像 Thomas 建议的那样,它使用了高斯模糊——但仅限于 x 方向。然后它使用组件传输将除了模糊边缘之外的所有部分的 alpha 值调高到 1 - 这基本上是单独存在的。如果你不这样做,你最终会得到一个锯齿状的边缘(你实际上是在手动对阴影边缘进行抗锯齿处理)。另一个 feFunc 将颜色调低为黑色。享受吧。

<svg id="785849135" width="960pt" height="720pt"
 viewBox="160 0 960 720"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
  <defs>
    <filter id='drop-shadow'>
      <!-- Shadow Offset -->
      <!-- EDIT: dx and dy to change the position of the shadow -->
      <feOffset     
        dx='-2'
        dy='4'
      />
      <!-- Shadow Blur -->
      <!-- EDIT: edit stdDeviation to change the shadow width -->
      <!-- "0 0 " is no blur -->
      <feGaussianBlur
        stdDeviation='3 0'
        result='offset-blur'
      />

      <feComponentTransfer in="offset-blur" result="shadow">
          <feFuncA type="table" tableValues="0 1 1 1 1 1 1 1 1 1 1 1 1 1"/>
          <feFuncR type="discrete" tableValues="0"/>
          <feFuncG type="discrete" tableValues="0"/>
          <feFuncB type="discrete" tableValues="0"/>

        </feComponentTransfer>
      <!-- Put original object over shadow -->
      <feComposite
        operator='over'
        in='SourceGraphic'
        in2='shadow'
      />
    </filter>
    </defs>
      <g filter="url(#drop-shadow)">
        <path fill="#654114" stroke="#654114" stroke-width="1" d="M547.71777 390.23407 L 527.47506 392.82273 540.08449 392.79837 539.86309 393.17777 426.68945 586.88612 399.23955 630.62126 361.53130 686.78918 337.97979 720.00000 362.91010 720.00000 391.19683 720.00000 410.65441 686.73793 441.43435 630.48495 463.47400 586.70712 552.51368 393.15324 552.68787 392.77403 565.28519 392.74969 547.71777 390.23407 z"/>
      </g>
</svg>

【讨论】:

  • 谢谢,但像以前的解决方案一样,阴影有圆角。基本上阴影需要是箭头的变黑和放大版本。
  • 没有办法用 SVG 过滤器跨浏览器做你想做的事。 (您可以使用具有适当尺寸的 feImage 过滤器来做您想做的事情,以拉入原始图形并放大它,但这在 Firefox 上不起作用。)
【解决方案2】:

据我了解,您不需要模糊效果,而是需要实心箭头。可能还是用&lt;feGaussianBlur&gt;让箭头“变大”,然后加上&lt;feColorTransfre&gt;来调整alpha通道,基本上让整个模糊区域变成实心的。

<svg id="785849135" width="960pt" height="720pt"
 viewBox="160 0 960 720"
 xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
  <defs>
    <filter id='drop-shadow'>
      <!-- Shadow Offset -->
      <!-- EDIT: dx and dy to change the size of the shadow -->
      <feOffset     
        dx='-4'
        dy='4'
      />
      <!-- Shadow Blur -->
      <!-- EDIT: edit stdDeviation to change the shadow blurriness -->
      <!-- "0" is no blur -->
      <feGaussianBlur
        stdDeviation='1'
        result='offset-blur'
      />
      <!-- Color & Opacity -->
      <feFlood
        flood-color='black'
        flood-opacity='1'
        result='color'
      />      
      <!-- Clip color inside shadow -->
      <feComposite
        operator='in'
        in='color'
        in2='offset-blur'
        result='shadow'
      />      
      <!-- Put original object over shadow -->
      <feComposite
        operator='over'
        in='SourceGraphic'
        in2='shadow'
      />
      <feComponentTransfer>
        <feFuncA type="linear" slope="99"/>
      </feComponentTransfer>
    </filter>
    </defs>
      <g  filter='url(#drop-shadow)'>
        <path fill="#654114" stroke="#654114" stroke-width="0.0" d="M547.71777 390.23407 L 527.47506 392.82273 540.08449 392.79837 539.86309 393.17777 426.68945 586.88612 399.23955 630.62126 361.53130 686.78918 337.97979 720.00000 362.91010 720.00000 391.19683 720.00000 410.65441 686.73793 441.43435 630.48495 463.47400 586.70712 552.51368 393.15324 552.68787 392.77403 565.28519 392.74969 547.71777 390.23407 z"/>
      </g>
</svg>

顺便说一句,我认为您的 &lt;svg&gt; 元素的 ID 无效。 AFAIK,它必须以字母或下划线开头。

【讨论】:

  • 我很欣赏您的响应,但箭头阴影在此解决方案中变得圆润。该要求要求阴影具有与箭头相同的锐利边缘,但稍大一些。 ID 可能无效,但我无法控制。
猜你喜欢
  • 1970-01-01
  • 2011-12-19
  • 2016-07-19
  • 2015-10-12
  • 2021-12-14
  • 2013-07-26
  • 2013-07-12
相关资源
最近更新 更多