Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何将大型SVG文件转换为平铺PNG?_Php_Linux_Svg_Imagemagick_Rsvg - Fatal编程技术网

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

Php 如何将大型SVG文件转换为平铺PNG?,php,linux,svg,imagemagick,rsvg,Php,Linux,Svg,Imagemagick,Rsvg,我有一个大的SVG文件(大约60 MB,10000x1000像素,但可能会变得更大),我想从中创建许多平铺的256x256 PNG图像(在该示例中,将有1600个图像;圆形(10000/256)^2) 有人知道如何在web服务器(运行PHP等)上实现这一点吗?我考虑过rsvg,但它似乎没有任何修改边界框的功能(我宁愿避免为每个部分手动执行)。ImageMagick也许能做到,但我一直没有太多的运气让它发挥作用。使用rsvg创建一个大的PNG,然后使用一个专用于平铺非常大的图像的工具可能会奏效,但

我有一个大的SVG文件(大约60 MB,10000x1000像素,但可能会变得更大),我想从中创建许多平铺的256x256 PNG图像(在该示例中,将有1600个图像;圆形(10000/256)^2)

有人知道如何在web服务器(运行PHP等)上实现这一点吗?我考虑过rsvg,但它似乎没有任何修改边界框的功能(我宁愿避免为每个部分手动执行)。ImageMagick也许能做到,但我一直没有太多的运气让它发挥作用。使用rsvg创建一个大的PNG,然后使用一个专用于平铺非常大的图像的工具可能会奏效,但我还没有找到这样的东西!速度并不是一个真正的问题,尽管它是可取的,所以如果最坏的情况发生,我可能会考虑修改SVG的每个部分的边界框。不过,我可以看到这一代人将永远消失

有人知道这样做的方法吗

编辑2016-03-02:

我最近再次需要这个问题的答案,Inkscape似乎是唯一能够以给定大小渲染给定区域SVG的工具(几乎满足这些要求,但它不允许更改纵横比)

我的目标是将一个SVG平铺成256x256平铺,现在我已经成功地制作了一个脚本,它可以平铺任意大的SVG,方法是在
inkscape
中重复渲染大约16000 x 16000,并平铺生成的图像。我已经成功地渲染了尺寸超过500000 x 500000像素的SVG,没有内存使用问题(这只是需要很长时间!)

我会看看。特别是,它们看起来正是你所需要的

不过,我从未将它用于大型SVG文件,因此我不知道它是否针对这种情况进行了优化。

有一个命令行模式来导出PNG,并使用一个可选参数来选择要导出的区域

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

似乎做了你想做的事。不过,首先需要将SVG转换为大型PNG(例如,在命令行上使用inkscape),然后使用PanoJS的tilemaker制作平铺。这是一个非常占用内存的beast,但是如果您能够让它成功运行,那么您可以使用PanoJS Javascript代码指向您的Web服务器。XKCD将其用于一个问题。

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

如果图像仅为10000x1000,则我在问题中使用的脚本效果最佳

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


您可能需要编辑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);

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

你试过rsvg转换,是吗?对它似乎创建了一个大的渲染好吧,但我有一个问题,分裂后。如果我错了,请纠正我,但它似乎没有任何用于平铺或指定区域的内置功能(所有操作符似乎大多用于指定比例)。ImageMagick肯定能够做到这一点(不过可能更容易转换为巨大的png),感谢您的建议,但我得到了一个没有帮助的结果“加载文档失败。”当使用它时!我将进行调查,但不幸的是,它看起来内存不足。这是我在尝试使用Batik从一个特别大的SVG生成PNG时获得的最佳结果。SVG的尺寸为-w 6188-h 136441。