在C / C ++中的svg示例

时间:2009-08-31 19:24:46

标签: c++ cairo

有人可以提供一个如何加载.svg文件并使用C / C ++和任何库显示它的示例吗?我想知道你是否会使用SDL,cairo或者什么。

5 个答案:

答案 0 :(得分:3)

Helltone,

结帐http://cairographics.org/cairomm/

可能会让事情变得更容易一些。

答案 1 :(得分:2)

正如帕维尔所说,QtSvg是我相信的方式。它更容易使用,但在我们的团队中,我们遇到了QtSvg的性能问题,尤其是在Linux上。所以我们决定手动直接解析SVG文件XML并使用Qt本身进行渲染。事实证明这要快得多。

伪代码: -

// Read the SVG file using XML parser (SAX)
void SvgReader::readFile()
{
  QFile file(<some svg filename>);
  if (!file.open(QFile::ReadOnly | QFile::Text)) {
    qWarning("Cannot open file");
    return;
  }
  QString localName;
  QXmlStreamAttributes attributes;
  pXml = new QXmlStreamReader(&file);
  pXml->setNamespaceProcessing(false);
  while (!pXml->atEnd()) {
    switch (pXml->readNext()) {
        case QXmlStreamReader::StartElement:
          localName = pXml->name().toString();
          if (localName.compare(<some element path>) == 0) {
            attributes = pXml->attributes();
            QStringRef data  = attributes.value(<some attribute name>);
            // parse/use your data;
          }
        // similarly other case statements 
    }
  }
}

答案 2 :(得分:1)

QtSvg模块可能会有所帮助。

答案 3 :(得分:1)

您可以尝试boost.svg_plot

答案 4 :(得分:0)

您可以尝试lunasvg

#include <lunasvg/svgdocument.h>

int main()
{
    SVGDocument document;
    document.loadFromFile("example.svg");

    std::uint32_t bitmapWidth = std::uint32_t(document.documentWidth());
    std::uint32_t bitmapHeight = std::uint32_t(document.documentHeight());

    std::unique_ptr<std::uint8_t[]> pixels(new std::uint8_t[bitmapWidth*bitmapHeight*4]);
    Bitmap bitmap(pixels.get(), bitmapWidth, bitmapHeight, bitmapWidth*4);

    document.render(bitmap, 96.0, 0x000000FF);

    // do something useful with bitmap here.
}