如何将SVG图像“路径”转换为单独的PNG图像?

时间:2009-11-24 04:06:59

标签: image-processing svg imagemagick librsvg rsvg

我有一个包含67个不同路径的SVG图像。

是否有任何库/教程可以为每个路径创建单独的光栅图像,例如PNG,也可以根据路径ID命名它们?

3 个答案:

答案 0 :(得分:3)

我不知道任何直接支持这个确切工作流程的库,但这可能是因为至少从表面看它似乎超级微不足道。假设您正在讨论顶级<path/>节点,那么这应该可以与任何可以使用XML的库一起完成 - 只需直接使用原始XML并忽略这个特定文档是SVG的事实。如果你有:

<svg ...>
  <path title="a" d="M 100 100 L 300 100 L 200 300 z" stroke-width="3" />
  <path title="b" d="M 200 100 L 300 100 L 200 300 z" stroke-width="3" />
  <path title="c" d="M 300 100 L 300 100 L 200 300 z" stroke-width="3" />
</svg>

你想要:

[a.svg]
<svg ...>
  <path d="M 100 100 L 300 100 L 200 300 z" stroke="blue" stroke-width="3" />
</svg>

[b.svg]
<svg ...>
  <path d="M 200 100 L 300 100 L 200 300 z" stroke="blue" stroke-width="3" />
</svg>

然后你只需要使用你选择的语言/库/工具并定义“路径”节点的路径,从根文档中取出它们并获取title属性,然后将它们复制到一个共享的新文档中使用标题作为文件名,使用相同的原始画布属性(如果适合您的情况 - 或将其更改为您需要的任何内容)。对于任何XML解析器甚至是最基本的DOM处理API(或XSLT / XPATH等)来说,这都应该是微不足道的。

答案 1 :(得分:3)

谢谢大家。我最终使用了两个答案的组合。我使用Ruby脚本来解析SVG文件并为每个路径写一个新文件,然后使用batik转换器从该文件生成一个png。接受的答案是Nick,因为关键的洞察力是创建单独的SVG很容易。谢谢尼克!

这是脚本:

require 'rubygems'
require 'nokogiri'
file = 'dark_florida_no_numbers.svg'

file_string = IO.read(file)

reader = Nokogiri::XML::Reader(file_string)

reader.each do |node|

  if node.name == 'path'
    county = node.attributes['id']
    File.open("dark/#{county}.svg", 'w') do |f|
      f.write "<svg xmlns:svg=\"http://www.w3.org/2000/svg\" xmlns=\"http://www.w3.org/2000/svg\" version=\"1.0\" >\n  <path "
      node.attributes.each do |attr, value|
        f.write " #{attr}=\"#{value}\""
      end
      f.write "/>\n</svg>"
    end
    `java -jar b/batik-rasterizer.jar dark/#{county}.svg`
  end
end

答案 2 :(得分:1)

Apache Batik库是用于显示和操作SVG内容的Java库。要生成PNG文件,您可以使用DOM API在所有路径上将display属性设置为none,但要渲染的路径除外,然后使用Transcoder API生成位图。循环遍历SVG文档中的所有路径元素,并将display属性设置为inline,以便为每个路径元素生成位图。