svg - Imagemagick:不符合绘图基元定义 `path'

标签 svg imagemagick

有问题的 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>

当我使用 identify 通过 Imagemagick 7.0.7-22 Q16 x86_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 有什么办法可以解决这个问题吗?

最佳答案

Why is this happening?

正如评论中所指出的,内部编码器/解码器正在将 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_2_”没有内容(推送和弹出堆栈之间没有任何内容),并且 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

Is there anything that can be done to Imagemagick that can fix this?

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

关于svg - Imagemagick:不符合绘图基元定义 `path',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673650/

相关文章:

python - MoviePY 无法在 Windows 上检测 ImageMagick 二进制文件

image-processing - 如何自动确定图像文件描绘的是照片还是 'graphic'?

python - 从 PythonMagick 图像获取像素数据?

c - 如何使用 MagickWand C API 组合图像?

javascript - 动态添加的 SVG g 标签未显示

css - 带图像的多边形

javascript - Raphael JS - 使用 SVG 文件

c++ - 使用 openMPI 发送对象

css - svg 无法在 ie9 中使用 css 调整大小

javascript - 使用 d3.js 的移动线时间表