SVG слои в растровое изображение - PullRequest
0 голосов
/ 22 июня 2019

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 Ответ

1 голос
/ 24 июня 2019

QSvgRenderer может render () определенный именованный элемент (например, объект или группа) из файла.Имя элемента будет значением атрибута id каждого элемента <g>.

Размер элемента (ограничивающая рамка) можно получить с помощью boundsOnElement () .

Вы можете создать один QSvgRenderer(const QString &filename), используя весь исходный файл SVG, а затем render() отдельные элементы из него во время итерации по XML.К сожалению, я не вижу способа перебора с использованием 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));
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...