使用SVG过滤器创建小插图?

时间:2013-08-02 13:38:11

标签: svg filter

我想使用SVG过滤器在图像上创建晕影。解决这个问题的最佳方法是什么?我已尝试使用feFlood创建一个flood-color,但这不起作用。现在我正在使用插图画家生成的png,但我想在svg中保留所有内容。

为了说明我的目标,这是原作:

without vignette

这应该是:

with vignette

更新:

我正在使用svg.jssvg.filter.js插件动态生成代码。这就是我试过的:

// create svg canvas
var draw = SVG('canvas').size(400,400)

// define gradient
var gradient = draw.gradient('radial', function(stop) {
    stop.at({ offset: 0, opacity: 0 })
    stop.at({ offset: 1 })
})
gradient.radius('80%')

// create image
var image = draw.image('http://distilleryimage11.ak.instagram.com/89ac2e90d9b111e297bf22000a1f9263_7.jpg').size(400,400)

// add filter
image.filter(function(add) {
    add.blend(add.source, add.flood(gradient), 'multiply')
})

这是生成的代码:

<svg id="SvgjsSvg1000" xmlns="http://www.w3.org/2000/svg" version="1.1" width="400" height="400" xmlns:xlink="http://www.w3.org/1999/xlink"     style="position:relative;overflow:hidden;left:0px;top:0px;">
    <image id="SvgjsImage1005" xlink:href="http://distilleryimage11.ak.instagram.com/89ac2e90d9b111e297bf22000a1f9263_7.jpg" width="400" height="400" filter="url(    #SvgjsFilter1006)"></image>
    <defs id="SvgjsDefs1001">
        <radialGradient id="SvgjsRadialGradient1002" r="80%">
            <stop id="SvgjsStop1003" stop-opacity="0" offset="0"></stop>
            <stop id="SvgjsStop1004" offset="1"></stop>
        </radialGradient>
        <filter id="SvgjsFilter1006">
            <feFlood id="SvgjsFeFlood1007" in="SourceGraphic" result="SvgjsFeFlood1007Out" flood-color="url(#SvgjsRadialGradient1002)"></feFlood>
            <feBlend id="SvgjsFeBlend1008" in="SourceGraphic" result="SvgjsFeBlend1008Out" in2="SvgjsFeFlood1007Out" mode="multiply"></feBlend>
        </filter>
    </defs>
</svg>

结果是完全黑色的图像。似乎feFlood元素不接受渐变作为填充,因为它使用颜色。

以下是示例代码的小提琴:http://jsfiddle.net/wout/VmUu6/

2 个答案:

答案 0 :(得分:1)

这对我有用而没有聚光灯,我使用具有多个停止点的径向渐变,您可以调整颜色,停止点和不透明度级别以获得您想要的效果。使用r(半径来加宽/缩短效果和fx,fy到位置。渐变比使用一些需要大量数学处理的滤镜更有效率

<radialGradient id="grad"
                fx="50%" fy="50%" r="55%"
                spreadMethod="pad">
    <stop offset="30%"   stop-color="#222222" stop-opacity="0"/>
    <stop offset="40%"   stop-color="#222222" stop-opacity="0.2"/>
    <stop offset="50%"   stop-color="#222222" stop-opacity="0.4"/>
    <stop offset="70%" stop-color="#222222" stop-opacity="0.6" />
    <stop offset="100%" stop-color="#222222" stop-opacity="1" />
</radialGradient>

应用于位于图像上方的矩形

  <image id="background" x="0" y="0" width="800px" height="530px"  preserveAspectRatio="true"
     xlink:href="http://i1-qa.adis.ws/i/Client_23/ss_collection_reddress?w=800"/>
<rect filter="url(#blur)" style="fill:url(#grad)" x="0" y="0" width="800px" height="530px"/>

vignette example

答案 1 :(得分:0)

我有一些小插图,并在我的slide share preso on filters.之前选择合成方法来获取技巧。这是最相关的过滤器代码。这不是一个真正的小插图 - 需要更长的滤镜和选择性图像组合,但它更容易理解。

 <filter>
        <feFlood id="flood-5" result="blackfield-6" x="0%" y="0%" width="100%" height="100%" result="blackfield-6" flood-color="#000000" flood-opacity="1"/>
        <feSpecularLighting id="specular-5" result="Spotlight-6" lighting-color="#FFFFFF" surfaceScale="1" specularConstant="1" specularExponent="120">
            <fePointLight id="pointlight-5" x="100" y="100" z="854"/>
        </feSpecularLighting>
        <feBlend id="svg-7" result="A-6" in="blackfield-6" in2="Spotlight-6" mode="lighten"/>
        <feBlend id="blend-5" result="B-6" in="A-6" in2="SourceGraphic" mode="multiply"/>
    </filter>