如何将每个图层另存为单独的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++;
}
}
}
答案 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));
}
}