2010-06-25 18 views
6

Tengo un archivo SVG grande (aproximadamente 60 MB, 10000x10000 píxeles, pero con la posibilidad de obtener mucho más grande), y quiero crear, por ejemplo, muchas imágenes en mosaico PNG 256x256 (en ese ejemplo habría 1600 imágenes, redondas (10000/256)^2).Cómo convertir archivos SVG grandes a PNG en mosaico?

¿Alguien tiene alguna idea de cómo hacer esto en un servidor web (ejecutando PHP, entre otras cosas)? Pensé en rsvg, pero no parece tener ninguna funcionalidad para modificar el cuadro delimitador (y prefiero evitar hacerlo manualmente para cada sección). ImageMagick podría hacerlo, pero no he tenido mucha suerte para que funcione. Usar rsvg para crear un PNG grande y luego usar una herramienta dedicada al mosaico de imágenes muy grandes podría funcionar, ¡pero no he tenido suerte encontrando tal cosa! La velocidad no es realmente un problema, aunque es deseable, así que si lo peor llega a ser peor, podría considerar modificar el cuadro delimitador del SVG por sección. Sin embargo, ¡podría ver que la generación tardaba una eternidad!

¿Alguien sabe de algún método para hacer esto?

Edición 03/02/2016:

Hace poco regresó a la necesidad de una respuesta para esta pregunta de nuevo, e Inkscape parece ser la única herramienta que puede hacer que el IVS para un área dada en tamaños dados (svgexport casi cumple con estos requisitos, pero no le permite cambiar la relación de aspecto).

Mi objetivo era colocar un SVG en mosaicos de 256x256, y ahora he realizado con éxito un script que puede colocar un SVG arbitrariamente grande haciendo repetidas representaciones en inkscape de aproximadamente 16,000 x 16,000 y colocando las imágenes resultantes. Realicé SVG con éxito donde las dimensiones superan los 500,000 x 500,000 píxeles, no hay problemas con el uso de la memoria (¡solo lleva mucho tiempo!)

+1

¿Has probado rsvg-convert, entonces? http://ubuntuforums.org/showthread.php?t=820965 –

+0

Sí; parece crear una gran representación de ella bien, pero luego tengo el problema de dividirla después. Corrígeme si me equivoco, pero no parece tener ninguna funcionalidad incorporada para mosaico o especificar la región (todos los operadores parecen ser para especificar la escala, principalmente). – Robert

+0

ImageMagick definitivamente debería ser capaz de hacerlo (probablemente sería más fácil conversar primero con un PNG gigante) – Spudd86

Respuesta

9

inkscape tiene un modo de línea de comandos para exportar archivos PNG, teniendo un argumento opcional para elegir qué área de exportar

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

Me gustaría ver Apache Batik. En particular, su SVG Rasterizer parece justo lo que necesita.

Nunca lo he usado para archivos SVG gigantes, así que no sé si está optimizado para ese caso o no.

+0

Gracias por la sugerencia, pero me sale un poco útil "Falló el documento de carga". cuando lo usas! Voy a investigar, pero parece que se está quedando sin memoria, por desgracia. – Robert

+0

Este es el que me ha dado los mejores resultados – Pere

+0

Core de Java para mi cuando intenté usar Batik para generar un PNG desde un SVG particularmente grande. Las dimensiones del SVG fueron -w 6188 -h 136441. – spot35

0

PanoJS parece hacer lo que preguntas acerca. Sin embargo, primero debes convertir el SVG a un PNG grande (por ejemplo, usando inkscape en la línea de comandos), y luego usar el formador de mosaicos de PanoJS para crear los mosaicos. Es una bestia muy intensiva en memoria, pero si puede hacer que funcione correctamente, puede usar el código de PanoJS Javascript para apuntar a su servidor web. XKCD lo usó para un large image describing money.

0

Mira esta pregunta que publiqué antes y trabajé.

Si la imagen es solo de 10000x10000, el script que tengo en la pregunta funciona mejor.

Sin embargo, si desea utilizar imágenes mucho más grandes, revise la secuencia de comandos en mi correo electrónico.

ImageMagick crop huge image

0

Es posible que desee para editar las propiedades del origen de su SVG (una copia), para hacer sólo ciertas áreas. Utilice las propiedades "ancho" y "alto" para que coincida con el tamaño de mosaico deseado (256) y "viewBox" en el área de mosaico deseada (por ejemplo, "viewBox =" 512 256 768 512 "'para la tercera ficha en la segunda fila) Se podría hacer algo como esto en un bucle:

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

No sé cómo esto se comporta de archivos muy grandes sin embargo.