如何将大型SVG文件转换为平铺式PNG?

6
我有一个很大的SVG文件(大约60 MB,10000x10000像素,但有可能会更大),我想从中创建许多256x256的PNG图像(例如,在该示例中将有1600个图像;round(10000/256)^2)。
有人知道如何在Web服务器上(运行PHP等其他内容)执行此操作吗?我考虑过rsvg,但它似乎没有修改包围框的任何功能(我宁愿避免为每个部分手动执行此操作)。ImageMagick可能能够实现它,但我一直没有成功地使其工作。使用rsvg创建大型PNG,然后使用专用于平铺非常大的图像的工具可能有效,但我没有找到这样的工具!速度并不是问题,尽管它是理想的,因此如果最坏的情况发生,我可能会考虑按节调整SVG的包围框。不过,我可以看到生成需要相当长的时间!
有人知道如何执行此操作的任何方法吗?
编辑2016-03-02:
我最近再次需要回答这个问题,Inkscape似乎是唯一一个可以呈现给定区域和大小的SVG的工具(svgexport 几乎符合这些要求,但它不允许更改宽高比)。
我的目标是将SVG平铺为256x256的瓷砖,并且我现在成功制作了一个脚本,该脚本可以通过在大约16,000 x 16,000中重复渲染inkscape来平铺任意大小的SVG并平铺生成的图像。我已经成功地呈现了尺寸超过500,000 x 500,000像素的SVG - 内存使用没有问题(只需要很长时间!)

1
你试过使用rsvg-convert了吗?http://ubuntuforums.org/showthread.php?t=820965 - Dave Jarvis
是的,它似乎可以创建一个大的渲染图像,但之后我就面临着将其分割的问题。如果我错了,请纠正我,但它似乎没有任何内置的平铺或指定区域的功能(所有操作符似乎都是用于指定比例的)。 - Robert
ImageMagick 应该肯定能够做到这一点(不过最好先转换为一个巨大的 PNG 文件)。 - Spudd86
5个回答

9

Inkscape具有命令行模式,可导出PNG文件,还可以选择要导出的区域(可选参数)。

inkscape vector.svg --export-png=raster.png --export-area=0:0:100:100

1
我会看一下Apache Batik。特别是他们的SVG Rasterizer,看起来正是你需要的。
不过,我从未用它处理过巨大的SVG文件,所以我不知道它是否针对这种情况进行了优化。

谢谢您的建议,但是当我使用它时,出现了一个无用的“加载文档失败”的错误。我会进行调查,但不幸的是,它似乎是由于内存不足导致的。 - Robert
这是给我带来最好结果的一个。 - Pere
当我尝试使用Batik从特别大的SVG生成PNG时,Java核心转储了。 SVG的尺寸为-w 6188 -h 136441。 - spot35

0
您可能希望编辑SVG的源属性(一份副本),仅渲染特定区域。使用“宽度”和“高度”属性来匹配所需的瓦片大小(256),并使用“viewBox”来指定所需的瓦片区域(例如对于第二行中的第三个瓦片,可使用“viewBox =“512 256 768 512”")。您可以在循环中执行类似以下代码的操作:
$sed = "sed 's/width=\"10000\"/width=\"256\"' ".$sourcefile;
$sed .= " | sed 's/height=\"10000\"/height=\"256\"'";
$sed .= " | sed 's/viewBox=\"0 0 10000 10000\"/viewBox=\"0 0 256 256\"'";
exec($sed." > ".$tmpfile);
exec('rsvg '.$tmpfile.' > '.$tilefile);

虽然我不知道这在非常大的文件上的表现如何。


0

PanoJS 似乎可以实现你所要求的功能。不过你需要先将 SVG 转换为大型 PNG(例如使用命令行上的 inkscape),然后使用 PanoJS 的 tilemaker 制作瓦片。它是一个非常占用内存的工具,但如果你能成功运行它,就可以使用 PanoJS 的 JavaScript 代码指向你的 Web 服务器。XKCD 就用它来制作 描述货币的大图


0

看看我之前发布并且已经运作良好的问题。

如果图像只有10000x10000,那么我在问题中提供的脚本效果最佳。

但是,如果你想使用更大的图像,请查看我的答案中的脚本。

ImageMagick裁剪巨大图像


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接