在我的应用程序中,使用图像来屏蔽SVG形状而不是反过来更方便。 (无论哪种方式都可以实现所需的多色覆盖效果。)问题是,当我使用普通(灰度)图像作为蒙版时,结果看起来像负片。是否有一个SVG属性或聪明的JS / D3技巧,我可以用它来告诉浏览器反转它的屏蔽协议,或者我是不是自己转换图像(这可能最终不像其他方式那样方便)? / p>
更新最小示例:
<!DOCTYPE html>
<title>Image mask</title>
<script type="text/javascript"
src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js">
</script>
<body>
<div>
<button>toggle</button>
</div>
</body>
<script>
var width = 194,
height = 240;
maskWidth = 30;
var svg = d3.select('body').append('svg')
.attr('height', 500);
var myMask = svg.insert('mask', ':first-child')
.attr('id', 'image_mask');
var marilyn = myMask.append('image')
.attr('width', width)
.attr('height', height)
.attr('xlink:href', "https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Marilyn_Monroe_photo_pose_Seven_Year_Itch.jpg/194px-Marilyn_Monroe_photo_pose_Seven_Year_Itch.jpg");
var positive = svg.append('rect')
.attr('width',maskWidth)
.attr('height', height)
.attr('fill', 'red')
.attr('mask', 'url(#image_mask)');
var negative = svg.append('rect')
.attr('x', maskWidth)
.attr('width', width - maskWidth)
.attr('height', height)
.attr('fill', 'green')
.attr('mask', 'url(#image_mask)');
var toggle = false;
d3.select('button').on('click', function() {
toggle = !toggle;
positive.transition()
.attr('height', toggle ? height/2 : height);
});
</script>
答案 0 :(得分:2)
您需要使用<filter>
来反转面具中的图像。
<svg height="500" xmlns:xlink="http://www.w3.org/1999/xlink" >
<defs>
<filter id="invert">
<feComponentTransfer>
<feFuncR type="table" tableValues="1 0"/>
<feFuncG type="table" tableValues="1 0"/>
<feFuncB type="table" tableValues="1 0"/>
</feComponentTransfer>
</filter>
<mask id="image_mask">
<image width="194" height="240" xlink:href="https://upload.wikimedia.org/wikipedia/commons/thumb/8/8d/Marilyn_Monroe_photo_pose_Seven_Year_Itch.jpg/194px-Marilyn_Monroe_photo_pose_Seven_Year_Itch.jpg"
filter="url(#invert)"/>
</mask>
</defs>
<rect width="30" height="120" fill="red" mask="url(#image_mask)"/>
<rect x="30" width="164" height="240" fill="green" mask="url(#image_mask)"/>
</svg>
&#13;