代码之家  ›  专栏  ›  技术社区  ›  Matt Coady

Imagemagick:不一致的图形图元定义“路径”

  •  2
  • Matt Coady  · 技术社区  · 8 年前

    SVG有问题(我清除了所有与问题无关的内容):

    <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 330 360">
    
      <defs>
        <path id="SVGID_1_" d="M166.3,7.4c-1.2,0-2.4,0-3.6,0c-10.4,0.2-20.9,1.3-26.9,3.8c-31.3,15.1-36.7,36.2-35.4,65.6"/>
      </defs>
    
      <clipPath id="SVGID_2_">
        <use xlink:href="#SVGID_1_"/>
      </clipPath>
    
      <path
        clip-path="url(#SVGID_2_)"
        d="M166.7 1.5S129-4.3 112.9 3.8c-7.3 3.7-12 11.7-15.5 19.1-5.2 11.2-6.8 36.4-6.8 36.4l15.9 11.4c.2-8.2 6.9-17.4 10.5-25.1 3.9-8.2 1.1-6.7 3.6-8.2 15.4-5.9 30.5-1 46 0 16.5 1.1 33.4-6.4 46 0 2.6 1.5 1.6-.6 3.6 8.2 1.6 6.8 12 18.8 10.5 25.1l15.9-11.4s-1.6-25.2-6.8-36.4c-3.4-7.4-8.2-15.4-15.5-19.1-15.9-8.1-53.6-2.3-53.6-2.3z"/>
    
    </svg>
    

    当我使用标识通过Imagemagick 7.0.7-22 Q16 x86\u 64运行此文件时:

    magick identify -verbose clipPath.svg
    

    输出以以下内容结束:

    identify: non-conforming drawing primitive definition `path' @ error/draw.c/DrawImage/3284.
    

    我已将问题缩小到第12行:

    clip-path="url(#SVGID_2_)"
    

    清理SVG并不是一个真正的选项,因为用户可以上传自己的SVG。所以问题是:

    A) 为什么会这样?

    B) 是否可以对Imagemagick执行任何操作来修复此问题?

    2 回复  |  直到 8 年前
        1
  •  1
  •   emcconville    8 年前

    为什么会这样?

    正如评论中指出的,内部编码器/解码器正在将SVG转换为MVG。这个 use xlink:href="#SVGID_1_" 延期(或者称为重定向?)不被理解;因此,省略。如果运行以下命令。。。

    convert clipPath.svg mvg:-
    

    将输出如下内容(添加空格缩进)。

    push graphic-context
      viewbox 0 0 330 360
      affine 1 0 0 1 0 0
      push defs
        push graphic-context
          path 'M166.3,7.4c-1.2,0-2.4,0-3.6,0c-10.4,0.2-20.9,1.3-26.9,3.8c-31.3,15.1-36.7,36.2-35.4,65.6'
        pop graphic-context
      pop defs
      push clip-path 'SVGID_2_'
      pop clip-path
      push graphic-context
        clip-path 'url(#SVGID_2_)'
        path 'M166.7 1.5S129-4.3 112.9 3.8c-7.3 3.7-12 11.7-15.5 19.1-5.2 11.2-6.8 36.4-6.8 36.4l15.9 11.4c.2-8.2 6.9-17.4 10.5-25.1 3.9-8.2 1.1-6.7 3.6-8.2 15.4-5.9 30.5-1 46 0 16.5 1.1 33.4-6.4 46 0 2.6 1.5 1.6-.6 3.6 8.2 1.6 6.8 12 18.8 10.5 25.1l15.9-11.4s-1.6-25.2-6.8-36.4c-3.4-7.4-8.2-15.4-15.5-19.1-15.9-8.1-53.6-2.3-53.6-2.3z'
      pop graphic-context
    pop graphic-context
    

    请注意,剪辑路径“SVGID\u 2\u”没有内容(push&pop stack之间没有内容),并且 defs -&燃气轮机; graphic-context 未标识为剪辑路径。

    如果您重写MVG,它应该可以按预期工作。

    push graphic-context
      viewbox 0 0 330 360
      affine 1 0 0 1 0 0
      push defs
        push clip-path 'SVGID_2_'
          push graphic-context
            path 'M166.3,7.4c-1.2,0-2.4,0-3.6,0c-10.4,0.2-20.9,1.3-26.9,3.8c-31.3,15.1-36.7,36.2-35.4,65.6'
          pop graphic-context
        pop clip-path
      pop defs
    
      push graphic-context
        clip-path 'url(#SVGID_2_)'
        path 'M166.7 1.5S129-4.3 112.9 3.8c-7.3 3.7-12 11.7-15.5 19.1-5.2 11.2-6.8 36.4-6.8 36.4l15.9 11.4c.2-8.2 6.9-17.4 10.5-25.1 3.9-8.2 1.1-6.7 3.6-8.2 15.4-5.9 30.5-1 46 0 16.5 1.1 33.4-6.4 46 0 2.6 1.5 1.6-.6 3.6 8.2 1.6 6.8 12 18.8 10.5 25.1l15.9-11.4s-1.6-25.2-6.8-36.4c-3.4-7.4-8.2-15.4-15.5-19.1-15.9-8.1-53.6-2.3-53.6-2.3z'
      pop graphic-context
    pop graphic-context
    

    是否可以对Imagemagick执行任何操作来修复此问题?

    升级到ImageMagick 7将提供 一些 改进,但正如Mark正确指出的那样,如果您将代理切换到支持高级功能的SVG渲染引擎,您将获得更多。阅读学员。ImageMagick附带的xml文件,或 online . 示例以内联注释的形式给出,如果您已经在系统上安装了rsvg或类似的工具,我也不会感到惊讶。

        2
  •  1
  •   Mark Setchell    8 年前

    如果您运行:

    identify -list delegate
    

    你会看到的 ImageMagick 代表处理 SVG 文件到 rsvg 因此,请确保这是最新的。

    还要检查是否需要添加任何开关或选项来处理任何特定的、麻烦的SVG元素,这些可以编辑到 delegates.xml 文件