我有一个大的SVG文件(大约60 MB,10000×10000像素,但有可能得到更大的),我想创build,例如,从它的许多平铺的256×256 PNG图像(在这个例子中,将有1600图像;圆(10000/256)^ 2)。
有没有人有任何想法如何在Web服务器上执行此操作(运行PHP等)? 我想过rsvg,但它似乎没有任何function来修改边界框(我宁愿避免手动为每个部分)。 ImageMagick可能可以做到这一点,但我没有得到它的运气好运。 使用rsvg来创build一个大的PNG,然后使用一个专门的平铺非常大的图像的工具可能工作,但我没有find这样的事情运气! 速度并不是一个问题,尽pipe这是可取的,所以如果最坏的情况发生,我可能会考虑修改SVG的每个部分的边界框。 不过,我可以看到这代人永远都在享受着。
任何人都知道任何方法来做到这一点?
编辑2016-03-02:
我最近又回过头来再次回答这个问题,而Inkscape似乎是唯一能够以给定的尺寸渲染给定区域的svgexport
工具( svgexport
几乎满足这些要求,但它不会让你改变宽高比)。
我的目标是将SVG拼接成256×256的拼贴,现在我已经成功地制作了一个脚本,可以通过在大约16,000 x 16,000的inkscape
中进行重复渲染并平铺所得图像来inkscape
任意大小的SVG。 我已经成功渲染了尺寸超过500,000 x 500,000像素的SVG,而且没有任何内存使用问题(只需要很长时间!)
inkscape有一个命令行模式导出PNG,采取可选参数来选择哪个区域导出
inkscape vector.svg --export-png=raster.png --export-area=0:0:100:100
我会看看Apache Batik 。 特别是,他们的SVG Rasterizer看起来就是你所需要的。
我从来没有使用它的巨大的SVG文件,但是,所以我不知道它是否针对这种情况进行了优化。
PanoJS似乎正在做你在问什么。 您需要先将SVG转换为大的PNG(例如,在命令行中使用inkscape),然后使用PanoJS的tilemaker制作拼贴。 这是一个内存密集的野兽,但是如果你能够成功运行,你可以使用PanoJS的Javascript代码指向你的网络服务器。 XKCD用它来描绘金钱的大图像 。
看看我以前发布的这个问题,并开始工作。
如果图片只有10000×10000,我在问题中的脚本效果最好。
如果你想要使用更大的图片,请查看我的anser脚本。
ImageMagick裁剪巨大的图像
您可能需要编辑SVG的源属性(副本),以仅渲染某些区域。 使用“宽度”和“高度”属性来匹配所需的图块大小(256)和“视图框”到所需的图块区域(例如,第二行的第三个图块的“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);
我不知道这是如何表现在非常大的文件,但。