将纹理应用于 SVG 中的图像

UnL*_*oCo 4 svg textures svg-filters

我正在尝试将纹理应用于图像

原来的

在此处输入图片说明

质地

在此处输入图片说明

结果(用 PHP GD 制作)

在此处输入图片说明

但是对于 SVG,我得到的最接近的是这个结果

<svg preserveAspectRatio="none" width="500" height="500" viewBox="0 0 500 500">
    <defs>
    
      <filter id="texture">
        <feImage href="https://i.imgur.com/pjWcnJs.jpg" result="texture-img"/>
        <feBlend in="SourceGraphic" in2="texture-img" mode="multiply"/>
      </filter>
    
    </defs>
    
    <g>
        <g filter="url(#texture)">
            <image x="0" y="0" href="https://i.imgur.com/oVEdsQt.png" opacity="1" width="500" height="500" />
        </g>
    </g>
    
</svg>
Run Code Online (Sandbox Code Playgroud)

小提琴

还有另一种不会对透明像素进行纹理化的方法吗?

UnL*_*oCo 5

我找到了一个解决方案,即通过复合过滤器将纹理传递给源图像

<svg preserveAspectRatio="none" width="500" height="500" viewBox="0 0 500 500">
    <defs>
    
      <filter id="texture">
        <feImage href="https://i.imgur.com/pjWcnJs.jpg" result="texture-img"/>
        <feComposite in2="SourceGraphic" operator="in" in="texture-img" result="composite"/>
        <feBlend in="SourceGraphic" in2="composite" mode="multiply"/>
      </filter>
    
    </defs>
    
    <g>
        <g filter="url(#texture)">
            <image x="0" y="0" href="https://i.imgur.com/oVEdsQt.png" opacity="1" width="500" height="500" />
        </g>
    </g>
    
</svg>
Run Code Online (Sandbox Code Playgroud)

为了平铺纹理,我feTile是这样使用的

<svg preserveAspectRatio="none" width="500" height="500" viewBox="0 0 500 500">
    <defs>
    
      <filter id="texture" x="0" y="0" width="100%" height="100%">
        <feImage href="https://i.imgur.com/gWH7NLm.jpg" result="texture-img" width="256" height="256"/>
        <feTile in="texture-img" x="0" y="0" width="100%" height="100%" result="tile" ></feTile>
        <feComposite in2="SourceGraphic" operator="in" in="tile" result="composite"/>
        <feBlend in="SourceGraphic" in2="composite" mode="multiply"/>
      </filter>
    
    </defs>
    
    <g>
        <g filter="url(#texture)">
            <image x="0" y="0" href="https://i.imgur.com/oVEdsQt.png" opacity="1" width="500" height="500" />
        </g>
    </g>
    
</svg>
Run Code Online (Sandbox Code Playgroud)

我通过检查如何inkscape应用材质纹理得到了这个想法