SVG フィルターを使用して画像にビネットを作成したいと思います。これにアプローチする最良の方法は何ですか?feFlood
私はすでにグラデーションとしてを作成しようとしましたflood-color
が、うまくいきません。現在、イラストレーターで生成された png を使用していますが、すべて svg で保持したいと考えています。
私が何を目指しているかを説明するために、これはオリジナルです:
そして、これはあるべきものです:
アップデート:
コードを動的に生成するために、svg.filter.jsプラグインでsvg.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/