SVG图层插入位图

时间:2019-06-22 03:11:00

标签: qt svg

enter image description here

如何将每个图层另存为单独的PNG? ................................................... ................................................... ................................................... ........

这是我到目前为止尝试过的。它只保存最后一层。

int i = 0;
while(!xmlReader->atEnd() && !xmlReader->hasError()) {
        // Read next element
        QXmlStreamReader::TokenType token = xmlReader->readNext();
        //If token is just StartDocument - go to next
        if(token == QXmlStreamReader::StartDocument)
                continue;
        //If token is StartElement - read it
        if(token == QXmlStreamReader::StartElement)
        {
            if(xmlReader->name() == "g")
            {
                QSvgRenderer renderer(xmlReader);

                QImage image(500, 500, QImage::Format_ARGB32);
                image.fill(Qt::transparent);

                QPainter painter(&image);
                renderer.render(&painter);
                    // Save, image format based on file extension
                image.save(QString("D:/%1.png").arg(i));
                i++;
            }
        }
}

1 个答案:

答案 0 :(得分:1)

QSvgRenderer可以render()来自文件中的特定命名元素(例如对象或组)。元素名称将是每个id元素的<g>属性值。

可以使用boundsOnElement()获得元素(边框)的大小。

您可以使用整个SVG源文件创建一个QSvgRenderer(const QString &filename),然后在遍历XML时render()使用其中的各个元素。不幸的是,我看不到使用QSvgRenderer本身进行迭代的任何方法。

QSvgRenderer renderer(svgFile);
...
while (...) {
  ...
  if (xmlReader->name() == "g" && xmlReader->attributes()->hasAttribute("id")) 
  {
     const QString elementId = xmlReader->attributes()->value("id");
     const QSize elementSize = renderer.boundsOnElement(id).size().toSize();
     QImage image(elementSize, QImage::Format_ARGB32);
     ...
     renderer.render(&painter, elementId);
     image.save(QString("D:/%1.png").arg(elementId));
  }
}