2010-06-25 45 views
6

我有一個大的SVG文件(大約60 MB,10000x10000像素,但有可能會變得更大),我想創建,例如,從它的許多平鋪的256x256 PNG圖像(在這個例子中會有1600張圖片;圓形(10000/256)^ 2)。如何將大型SVG文件轉換爲平鋪PNG?

有沒有人有任何想法如何在Web服務器上執行此操作(運行PHP等)?我想過rsvg,但它似乎沒有任何功能來修改邊界框(我寧願避免爲每個部分手動執行)。 ImageMagick可能能夠做到這一點,但我沒有運行得很好。使用rsvg創建一個大的PNG,然後使用一個專用於平鋪非常大的圖像的工具可能會奏效,但我一直沒有找到這樣的東西!速度並不是真正的問題,雖然它是可取的,所以如果最糟糕的是最壞的,我可能會考慮修改每節的SVG邊界框。儘管如此,我可以看到這代人永遠在享受着!

任何人都知道任何方法來做到這一點?

編輯2016年3月2日:

最近,我又折回來需要爲這個問題的答案,以及Inkscape中似乎可在給定的尺寸顯示出給定區域SVGs(唯一的工具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 – 2010-06-26 04:44:37

+0

是的;它似乎創建了一個很好的渲染,但之後我有問題分裂它。糾正我,如果我錯了,但它似乎沒有任何內置的平鋪或指定區域的功能(所有操作符似乎用於指定比例,主要是)。 – Robert 2010-06-26 09:04:52

+0

ImageMagick應該可以做到這一點(它可能會更容易轉變爲一個巨大的PNG雖然) – Spudd86 2010-06-27 02:39:49

回答

9

inkscape有一個命令行模式導出的PNG文件,以一個可選的參數來選擇要導出的區域

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

我想看看Apache Batik。特別是,他們的SVG Rasterizer看起來就像你所需要的。

雖然我從來沒有用它來創建巨型的SVG文件,所以我不知道它是否針對這種情況進行了優化。

+0

感謝您的建議,但我得到了一個無益的「加載文檔失敗。」。當使用它!我會調查,但不幸的是,它看起來內存不足。 – Robert 2010-06-26 09:11:30

+0

這是給我最好結果的那個 – Pere 2012-12-28 15:39:59

+0

當我嘗試使用Batik從一個特別大的SVG生成PNG時,Java核心轉儲對我來說是這樣。 SVG的尺寸是-w 6188 -h 136441。 – spot35 2014-02-28 17:45:07

0

PanoJS似乎做你問什麼。您需要先將SVG轉換爲大型PNG(例如,在命令行中使用inkscape),然後使用PanoJS的tilemaker製作拼貼。這是一個內存密集型的野獸,但是如果你能夠成功運行,你可以使用PanoJS的Javascript代碼指向你的網絡服務器。 XKCD將其用於large image describing money

0

看看我以前發佈的這個問題,並得到了工作。

如果圖片只有10000x10000,我在問題中的腳本效果最好。

如果想要使用更大的圖像,請查看我的anser中的腳本。

ImageMagick crop huge image

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); 

我不知道該怎麼雖然表現上非常大的文件。