6

我有一个大的 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 的平铺,现在我已经成功地制作了一个脚本,该脚本可以通过重复渲染inkscape大约 16,000 x 16,000 并平铺生成的图像来平铺任意大的 SVG。我已经成功渲染了尺寸超过 500,000 x 500,000 像素的 SVG——内存使用没有问题(只是需要很长时间!)

4

5 回答 5

9

inkscape具有导出 png 的命令行模式,采用可选参数来选择要导出的区域

inkscape vector.svg --export-png=raster.png --export-area=0:0:100:100
于 2010-07-23T08:49:26.130 回答
1

我会看看Apache Batik。特别是,他们的SVG Rasterizer看起来正是您所需要的。

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

于 2010-06-26T01:05:52.373 回答
0

PanoJS似乎可以满足您的要求。不过,您需要先将 SVG 转换为大的 PNG(例如在命令行上使用 inkscape),然后使用 PanoJS 的 tilemaker 来制作瓷砖。这是一个非常占用内存的野兽,但如果你能让它成功运行,你就可以使用 PanoJS Javascript 代码指向你的网络服务器。XKCD 将其用于描述金钱的大图像

于 2012-04-18T04:10:33.910 回答
0

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

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

但是,如果您想使用更大的图像,请查看我的分析器中的脚本。

ImageMagick 裁剪大图像

于 2012-05-15T09:42:05.927 回答
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);

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

于 2012-08-27T08:38:29.783 回答