SVG feDiffuseLighting滤镜产生的纸张效果

如何解决SVG feDiffuseLighting滤镜产生的纸张效果

我正在尝试通过应用以下方法来实现SVG中形状上的纸上绘画效果

  • 位移过滤器和
  • 模糊

在背景上一切正常,但是如果我尝试对前景中的形状应用相同的滤镜,则会在形状本身周围产生怪异的边界,如果形状是路径,情况会更糟。

This是形状上没有过滤器的版本,this是将过滤器应用于旋转的rect的版本,而this是过滤器所在的版本应用于路径。顺便说一句,置换和模糊滤镜似乎只能在Firefox中正常工作。

下面是rect版本的代码

我可以将漫射照明滤镜应用于没有奇怪边界的形状吗?

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-Syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   id="svg66"
   version="1.1"
   viewBox="0 0 1100.20831 1529.16669"
   height="1529.16669mm"
   width="1100.20831mm">
  <Metadata
     id="Metadata63">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </Metadata>

  <filter id='roughpaper' x='0%' y='0%' width='100%' height="102%">
    <feTurbulence type="fractalNoise" baseFrequency="0.2" result='noise' numOctaves="3" />
    <feDiffuseLighting in='noise' out="paper" lighting-color='#ffffff' surfaceScale='2'>
      <fedistantLight azimuth='100' elevation='60' />
    </feDiffuseLighting>

    <feGaussianBlur in="paper" stdDeviation="1.2" result="blurredpaper"/>

    <feComponentTransfer>
      <feFuncA type="linear" slope="0.7"/>
    </feComponentTransfer>    
  </filter>

  <filter id="dispmorph">
    <feMorphology radius="0" in="SourceGraphic" result="morph" />
    <feTurbulence type="turbulence" baseFrequency="0.04 0.04" numOctaves="2" result="turbulence"/>
    <fedisplacementMap in2="turbulence" in="morph" out="turbuled" scale="1" xChannelSelector="B" yChannelSelector="G"/>
    <feGaussianBlur in="turbuled" stdDeviation="0.2" result="blur"/>

    <feTurbulence type="fractalNoise" baseFrequency="0.2" result='noise' numOctaves="3" />
    <feDiffuseLighting in='noise' out="paper" lighting-color='#ffffff' surfaceScale='2'>
      <fedistantLight azimuth='100' elevation='60' />
    </feDiffuseLighting>

    <feGaussianBlur in="paper" stdDeviation="1.2" result="blurredpaper"/>

    <feBlend in="blur" in2="blurredpaper" mode="multiply"/>

  </filter>
  <g id="layer1">
    <rect
       filter="url(#roughpaper)"      
       y="0"
       x="0"
       height="100"
       width="100"
       id="rect92"
       />
    <rect
    transform="rotate(-10 50 100)"
    id="path82"
    y="25"
    x="25"
    height="50"
    width="50"
    filter="url(#dispmorph)"      
    style="fill:#204a87;stroke:none" />
  </g>
</svg>

解决方法

feDisplacementMap的输出和feBlend之间似乎存在交互错误。我可以至少在Chrome / Windows上解决此问题,方法是将feBlend / multiply替换为等效的feComposite / arithmetic k1 = 1

<svg
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:cc="http://creativecommons.org/ns#"
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:svg="http://www.w3.org/2000/svg"
   xmlns="http://www.w3.org/2000/svg"
   id="svg66"
   version="1.1"
   viewBox="0 0 1100.20831 1529.16669"
   height="1529.16669mm"
   width="1100.20831mm">
  <metadata
     id="metadata63">
    <rdf:RDF>
      <cc:Work
         rdf:about="">
        <dc:format>image/svg+xml</dc:format>
        <dc:type
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
        <dc:title></dc:title>
      </cc:Work>
    </rdf:RDF>
  </metadata>

  <filter id='roughpaper' x='0%' y='0%' width='100%' height="102%">
    <feTurbulence type="fractalNoise" baseFrequency="0.2" result='noise' numOctaves="3" />
    <feDiffuseLighting in='noise' out="paper" lighting-color='#ffffff' surfaceScale='2'>
      <feDistantLight azimuth='100' elevation='60' />
    </feDiffuseLighting>

    <feGaussianBlur in="paper" stdDeviation="1.2" result="blurredpaper"/>

    <feComponentTransfer>
      <feFuncA type="linear" slope="0.7"/>
    </feComponentTransfer>    
  </filter>

  <filter id="dispmorph">
    <feMorphology radius="0" in="SourceGraphic" result="morph" />
    <feTurbulence type="turbulence" baseFrequency="0.04 0.04" numOctaves="2" result="turbulence"/>
    <feDisplacementMap in2="turbulence" in="morph" out="turbuled" scale="1" xChannelSelector="B" yChannelSelector="G"/>
    <feGaussianBlur in="turbuled" stdDeviation="0.2" result="blur"/>

    <feTurbulence type="fractalNoise" baseFrequency="0.2" result='noise' numOctaves="3" />
    <feDiffuseLighting in='noise' out="paper" lighting-color='#ffffff' surfaceScale='2'>
      <feDistantLight azimuth='100' elevation='60' />
    </feDiffuseLighting>

    <feGaussianBlur in="paper" stdDeviation="1.2" result="blurredpaper"/>

    <feComposite operator="arithmetic" k1="1" in="blur" in2="blurredpaper"/>

  </filter>
  <g id="layer1">
    <rect
       filter="url(#roughpaper)"      
       y="0"
       x="0"
       height="100"
       width="100"
       id="rect92"
       />
    <rect
    transform="rotate(-10 50 100)"
    id="path82"
    y="25"
    x="25"
    height="50"
    width="50"
    filter="url(#dispmorph)"      
    style="fill:#204a87;stroke:none" />
  </g>
</svg>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?