如何使用SVG形状来遮罩图像?

4
我有一个SVG形状,我想将其用作遮罩,以便我添加的每个图像都会被放置在该形状的内部。
这是我想用作遮罩的形状: Image to use as a mask 这是我的SVG代码,它可以获得黑色的遮罩:

<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="157.000000pt" height="163.000000pt" viewBox="0 0 157.000000 163.000000" preserveAspectRatio="xMidYMid meet">
   <metadata>
      My svg Mask
   </metadata>
   <g transform="translate(0.000000,163.000000) scale(0.100000,-0.100000)"
      fill="#000000" stroke="none">
      <path d="M373 1197 c-355 -355 -363 -363 -363 -402 0 -39 8 -47 363 -402 355
         -355 363 -363 402 -363 39 0 47 8 402 363 355 355 363 363 363 402 0 39 -8 47
         -363 402 -355 355 -363 363 -402 363 -39 0 -47 -8 -402 -363z"/>
   </g>
</svg>

通过添加一张图片,我希望能够实现如下最终效果:

期望的最终效果

如何让我添加到网站上的任何图片都被svg文件或红色图形遮罩,以便显示类似于此图片?

期望的最终效果


1
你不想要一个clipPath而不是一个mask吗? - Robert Longson
我很乐意帮忙,只是我不知道如何使用ClipPath得到那个精确的形状。你有什么想法如何得到那个精确的形状吗?谢谢。 - Man Of God
1
在设置了rx的矩形元素上执行rotate(45)变换。 - Robert Longson
非常感谢,但我无法找到可在各种浏览器上运行的解决方案。您能否为我提供一个jsfiddle?我对跨浏览器的clipPath不是很熟悉。谢谢! - Man Of God
@RobertLongson 这是我能想到的 http://codepen.io/manofgod/pen/YXbKLr 然而,这在IE上不兼容。 - Man Of God
1个回答

8
这是一个应用SVG裁剪路径的CSS示例:

body {
  margin: 0
}

.test {
  height: 160px;
  width: 170px;
  -webkit-clip-path: url(#shape);
  clip-path: url(#shape);
}
<svg width="0" height="0">
    <defs>
        <clipPath id="shape">
            <path transform="translate(0.000000,163.000000) scale(0.100000,-0.100000)" d="M373 1197 c-355 -355 -363 -363 -363 -402 0 -39 8 -47 363 -402 355
-355 363 -363 402 -363 39 0 47 8 402 363 355 355 363 363 363 402 0 39 -8 47
-363 402 -355 355 -363 363 -402 363 -39 0 -47 -8 -402 -363z" />
        </clipPath>
    </defs>
</svg>
<img class='test' src='https://placeimg.com/640/480/animals' />

需要记住的一件事是,你不能在剪切蒙版中使用 g(分组标签),否则它将无法显示;

因此,在您的示例中,您会发现变换属性直接放在路径上,而不是放在 g 标签上。

fiddle


+1。但是我有一个问题,即使我完全复制并粘贴代码,除非它在jsfiddle或codepen上,否则它不起作用。但是,除非我使用我在codepen或jsfiddle上使用的url,否则它在我的php页面上也不起作用,而且它只适用于第一张图片。第二张图片不显示。如果有一个文本在它之前,它会覆盖图像。你能帮我找出原因吗?谢谢。 - Man Of God
尝试提出另一个问题:“如果将SVG集成到PHP中,为什么无法工作”(发布源代码和所有细节)。 - maioman
顺便提一下,这个解决方案目前不支持IE,但应该有一个polyfill可以解决。 - maioman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接