¿Biblioteca C/C++ para analizar archivos SVG?

Quiero analizar archivos SVG en C++ en OS X y necesito una biblioteca. Debe ser simple, ligero y no debe tener muchas dependencias. Mis archivos SVG también son simples: solo contienen formas y rutas simples como rectángulos e información de transformación. ¿Conoces algún analizador?

Nota: quiero ir más allá de la información de forma analizada de la estructura XML, como el ancho del rectángulo, la altura y los puntos de ruta, en flotadores, etc. Ya probé libtinysvg , y no analiza la mayoría de las muestras de w3c y tiene algunas dependencias propias.

Analizar svg es trivial; es solo un xml. Sin embargo , interpretarlo es otro asunto. Cualquier biblioteca que valga la pena publicar intentará interpretarla de manera razonablemente completa, pero eso requiere una biblioteca de dibujos vectoriales bastante completa que aparecerá como dependencia.
Por las etiquetas y el texto, creo que está tratando de decir que prefiere una solución C ++, pero podría vivir con C, ¿estoy en lo correcto? Y, dado que esta es una vieja pregunta, ¿alguna vez encontró una solución? ¿Podrías compartirlo?

Respuestas (4)

La nueva biblioteca SVG++ es una buena opción para la lectura de SVG en C++, excepto que no es liviana y requiere la biblioteca Boost. Pero como es una biblioteca de solo encabezados y usa solo bibliotecas de solo encabezados de Boost, solo necesita buscar SVG++ y Boost y agregarlos para incluir rutas, no se requiere construcción.

Tienes pocas opciones:

  • librsvg del proyecto Cairo Graphics
  • extender libsvgtiny para satisfacer sus necesidades
  • extrae la capa SVG de Amaya
  • use un analizador xml y luego analice las propiedades según sea necesario
  • para C++ y dependencias significativas: QT, webkit o chromium

Nota sobre libsvgtiny: está desarrollado por el proyecto Netsurf Browser y tiene dependencias mínimas que muchos otros proyectos probablemente habrían incluido, pero intencionalmente separan diferentes funcionalidades (también analizan html, xml y css, por lo que los bits de análisis comunes son una biblioteca separada). He creado un visor de svg básico a partir de su código de ejemplo en nsfb que está compilado estáticamente hasta menos de 300 kb con el backend libxcb usando musl-libc (glibc + libx11 + librsvg + todas sus dependencias son más de 10 veces eso)

Nota sobre librsvg: es el más utilizado, pero tiene muchas más dependencias.

Nota sobre Amaya: no está en desarrollo activo, solo se menciona en caso de que esté cerca de lo que está tratando de hacer para empezar. Las versiones anteriores a la 9.x solo requerían gtk+-1.X (ahora Wx, que es multiplataforma)

Nota sobre QT: si está utilizando C ++ y desea una interfaz gráfica de usuario multiplataforma, entonces esta es probablemente una buena opción, ya que muchos kits de herramientas de interfaz gráfica de usuario de C ++ (fltk, FOX, etc.) no tienen capacidad incorporada de svg

webkit o chromium incrustado: estos son multiplataforma y ofrecen muchos excesos. No solo obtendrá SVG, sino también muchas cosas que quizás no necesite... pero dado que todos los programas evolucionan hasta que pueden enviar correo, esto lo pondrá adelante en el juego más adelante.

Analizadores XML: Demasiados para mencionarlos, pero es posible que pueda extraer un poco de código de tinysvg para obtener propiedades adicionales

Mi recomendación: comience con svgtiny y agregue las capacidades que necesite. Los desarrolladores de Netsurf son extremadamente abiertos y serviciales.

QT Framework incluye QT SVG , un módulo capaz de generar y renderizar archivos SVG.

SVG es un tipo especial de XML ( fuente ). Entonces, cualquier biblioteca C/C++ que le permita analizar XML también le permitirá analizar SVG.

Muchas bibliotecas se publican como respuestas a la pregunta Mejor analizador XML abierto para C++ . Algunos de ellos son

Desafortunadamente, todas las partes interesantes de SVG se almacenan en atributos de su esquema XML, por lo que un analizador XML simple es esencialmente inútil, ya que solo hace alrededor del 10% del trabajo de interpretación de SVG.