2010-06-25 5 views
6

Ho un file SVG di grandi dimensioni (circa 60 MB, 10000x10000 pixel ma con il potenziale per ingrandirle) e sto cercando di creare, per esempio, molte immagini Png 256x256 affiancate (in questo esempio ci sarebbe 1600 immagini, rotondo (10000/256)^2).Come convertire file SVG di grandi dimensioni in PNG piastrellati?

Qualcuno ha idea di come farlo su un server web (con PHP in esecuzione tra le altre cose)? Ho pensato a rsvg, ma non sembra avere alcuna funzionalità per modificare il riquadro di delimitazione (e preferisco evitare di farlo manualmente per ogni sezione). ImageMagick potrebbe essere in grado di farlo, ma non ho avuto molta fortuna nel farlo funzionare. Usare rsvg per creare un PNG di grandi dimensioni e poi usare uno strumento dedicato alla piastrellatura di immagini molto grandi potrebbe funzionare, ma non ho avuto fortuna nel trovare una cosa del genere! La velocità non è davvero un problema, anche se è auspicabile, quindi se il peggio arriva al peggio, potrei esaminare la modifica del riquadro di delimitazione di SVG per sezione. Potevo vedere la generazione impiegare per sempre, però!

Qualcuno sa di metodi per farlo?

Edit 2016/03/02:

ho recentemente tornato a che necessitano di una risposta per questa domanda di nuovo, e Inkscape sembra essere l'unico strumento che può rendere SVG per una data area in determinati formati (svgexport soddisfa quasi tutti questi requisiti, ma non consente di modificare le proporzioni).

Il mio obiettivo era quello di affiancare un file SVG a 256x256 tile e ora ho creato uno script che può affiancare un SVG arbitrariamente grande eseguendo rendering ripetuti in inkscape di circa 16.000 x 16.000 e affiancando le immagini risultanti. Ho eseguito correttamente il rendering di SVG in cui le dimensioni superano i 500.000 x 500.000 pixel, nessun problema con l'utilizzo della memoria (ci vuole solo molto tempo!)

+1

Hai provato rsvg-convert, quindi? http://ubuntuforums.org/showthread.php?t=820965 –

+0

Sì; sembra creare un grande rendering, okay, ma poi ho il problema di dividerlo in seguito. Correggimi se ho torto, ma non sembra avere alcuna funzionalità incorporata per affiancare o specificare la regione (tutti gli operatori sembrano essere per specificare la scala, soprattutto). – Robert

+0

ImageMagick dovrebbe essere sicuramente in grado di farlo (probabilmente sarebbe più facile convertire prima un png gigante) – Spudd86

risposta

9

inkscape ha una modalità a riga di comando per esportare PNG, prendendo un argomento opzionale di scegliere quale area esportare

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

Guarderei Apache Batik. In particolare, il loro SVG Rasterizer sembra proprio quello di cui hai bisogno.

Non l'ho mai usato per giganti file SVG, quindi, non so se è ottimizzato per quel caso o meno.

+0

Grazie per il suggerimento, ma ricevo un inutile "Caricamento del documento fallito". quando lo si usa! Indagherò, ma sembra che stia esaurendo la memoria, sfortunatamente. – Robert

+0

Questo è quello che mi ha dato i migliori risultati – Pere

+0

core dump Java per me quando ho provato ad usare Batik per generare un PNG da un SVG particolarmente grande. Le dimensioni di SVG erano -w 6188 -h 136441. – spot35

0

PanoJS sembra di fare quello che stai chiedendo circa. Devi prima convertire l'SVG in un PNG di grandi dimensioni (ad esempio usando inkscape sulla riga di comando), quindi utilizzare il tilemaker di PanoJS per creare le tessere. È una bestia con molta memoria, ma se riesci a farla funzionare correttamente, puoi usare il codice Javascript PanoJS per puntare al tuo webserver. XKCD lo ha usato per un large image describing money.

0

Dai un'occhiata a questa domanda che ho postato in precedenza e ho funzionato.

Se l'immagine è solo 10000x10000 lo script che ho nella domanda funziona meglio.

Se tuttavia si desidera utilizzare immagini molto più grandi, controllare lo script nella mia anser.

ImageMagick crop huge image

0

Si potrebbe desiderare di modificare le proprietà di origine del vostro SVG (una copia), per rendere solo alcune aree. Usa le proprietà "width" e "height" per abbinare la dimensione della tessera desiderata (256) e il "viewBox" all'area di tile desiderata (ad esempio 'viewBox = "512 256 768 512"' per la terza tessera nella seconda riga). Si potrebbe fare qualcosa di simile in un ciclo:

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

Non so come questo si comporta su file molto grandi però.