Reputation: 1247
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
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