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

时间:2010-06-25 22:48:50

标签: php linux svg imagemagick rsvg

我有一个大的SVG文件(大约60 MB,10000x10000像素,但有可能变得更大),我想要创建许多平铺的256x256 PNG图像(在那个例子中会有是1600张图像;圆形(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 - 内存使用没有问题(这需要很长时间!)

5 个答案:

答案 0 :(得分:9)

inkscape有一个命令行模式来导出png,带一个可选参数来选择要导出的区域

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

答案 1 :(得分:1)

我会看Apache Batik。特别是,他们SVG Rasterizer看起来就像你需要的那样。

我从来没有将它用于巨型SVG文件,所以我不知道它是否针对这种情况进行了优化。

答案 2 :(得分:0)

PanoJS似乎正在做你要问的事情。您需要首先将SVG转换为大型PNG(例如,在命令行上使用inkscape),然后使用PanoJS的tilemaker来制作切片。它是一个非常内存密集的野兽,但如果你能让它成功运行,你可以使用PanoJS Javascript代码指向你的web服务器。 XKCD将其用于large image describing money

答案 3 :(得分:0)

查看我之前发布的这个问题并开始工作。

如果图片只有10000x10000,我在问题中的脚本效果最好。

如果你想要使用更大的图像,请查看我的anser中的脚本。

ImageMagick crop huge image

答案 4 :(得分:0)

您可能希望编辑SVG的源属性(副本),仅渲染某些区域。使用“width”和“height”属性将所需的图块大小(256)和“viewBox”匹配到所需的图块区域(例如,对于第二行中的第3个图块,“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);

我不知道这对非常大的文件有何影响。