TerribleDog
TerribleDog

Reputation: 1247

SVG layers into Bitmap

enter image description here

How do I save each layer as a separate PNG? ..............................................................................................................................................................

Here's what I tried so far. It only saves the last layer.

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++;
            }
        }
}

Upvotes: 0

Views: 912

Answers (1)

Maxim Paperno
Maxim Paperno

Reputation: 4869

QSvgRenderer can render() a specific named element (like an object or group) from within a file. The element name would be the id attribute value of each <g> element.

The size of an element (bounding box) can be obtained with boundsOnElement().

You could create one QSvgRenderer(const QString &filename) using the whole SVG source file, and then render() the individual elements from it as you iterate over the XML. Unfortunately I don't see any way to iterate using QSvgRenderer itself.

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

Upvotes: 1

Related Questions