Библиотека C/C++ для анализа файлов SVG?

Я хочу анализировать файлы SVG на C++ в OS X, и мне нужна библиотека. Он должен быть простым, легким и не должен иметь много зависимостей. Мои файлы SVG также просты — они содержат только простые формы и пути, такие как прямоугольники и информацию о преобразовании. Вы знаете какие-нибудь парсеры?

Примечание. Я хочу выйти за рамки информации о форме, проанализированной XML-структурой, такой как ширина прямоугольника, высота и точки пути, в числах с плавающей запятой и т. д. Я уже пробовал libtinysvg , и он не анализирует события большинства образцов w3c и имеет несколько собственных зависимостей!

Разбор svg тривиален; это просто xml. А вот интерпретировать - другое дело. Любая библиотека, которую стоит опубликовать, попытается интерпретировать ее достаточно полно, но для этого требуется довольно многофункциональная библиотека векторного рисования, которая будет отображаться как зависимость.
По тегам и тексту, я думаю, вы пытаетесь сказать, что предпочитаете решение на С++, но можете жить с C - я прав? И, поскольку это старый вопрос, вы когда-нибудь находили решение? Не могли бы вы поделиться им?

Ответы (4)

Новая библиотека SVG++ — хороший выбор для чтения SVG на C++, за исключением того, что она не легкая и требует библиотеки Boost. Но поскольку это библиотека только для заголовков и использует только библиотеки только для заголовков из Boost, вам нужно только получить как SVG++, так и Boost и добавить их, чтобы включить пути, сборка не требуется.

У вас есть несколько вариантов:

  • librsvg из проекта Cairo Graphics
  • расширить libsvgtiny для удовлетворения ваших потребностей
  • извлечь слой SVG из Amaya
  • используйте синтаксический анализатор xml, а затем анализируйте свойства по мере необходимости
  • для C++ и существенных зависимостей: QT, webkit или chromium

Примечание о libsvgtiny: он разработан проектом Netsurf Browser и имеет очень минимальные зависимости, которые, вероятно, были бы включены во многие другие проекты, но они намеренно разделяют различные функции (они также анализируют html, xml и css, поэтому общие биты синтаксического анализа отдельная библиотека). Я построил базовую программу просмотра svg из их примера кода в nsfb , который статически скомпилирован до размера менее 300 КБ с бэкэндом libxcb, использующим musl-libc (glibc + libx11 + librsvg + все их зависимости более чем в 10 раз больше)

Примечание о librsvg: он используется чаще всего, но имеет значительно больше зависимостей.

Примечание об Amaya: не находится в активной разработке, упоминается только в том случае, если это близко к тому, что вы пытаетесь сделать с самого начала. Версии до 9.x требовали только gtk+-1.X (теперь Wx кроссплатформенный)

Примечание по QT: если вы используете C++ и хотите получить кросс-платформенный графический интерфейс, то это, вероятно, хороший выбор, поскольку многие наборы графических инструментов C++ (fltk, FOX и т. д.) не имеют встроенной возможности svg.

встроенный webkit или хром: они кроссплатформенные и предлагают множество излишеств. Вы получите не только SVG, но и множество других вещей, которые могут вам не понадобиться... но, поскольку все программы развиваются до тех пор, пока они не смогут работать с почтой, позже это позволит вам выйти вперед.

Синтаксические анализаторы XML: слишком много, чтобы упомянуть, но вы можете извлечь немного кода из tinysvg для дополнительных свойств.

Моя рекомендация: начните с svgtiny и добавляйте любые возможности, которые вам нужны. Разработчики Netsurf чрезвычайно открыты и готовы помочь.

QT Framework включает QT SVG , модуль, способный генерировать и отображать файлы SVG.

SVG — это особый тип XML ( исходный код ). Таким образом, любая библиотека C/C++, которая позволяет вам анализировать XML, также позволит вам анализировать SVG.

Многие библиотеки публикуются в качестве ответов на вопрос « Лучший открытый анализатор XML для C++ » . Некоторые из них

К сожалению, все интересные части SVG хранятся в атрибутах его XML-схемы, поэтому простой синтаксический анализатор XML практически бесполезен, поскольку он выполняет только около 10% работы по интерпретации SVG.