it-swarm-pt.tech

Como renderizar um SVG dimensionado para um QImage?

Existe uma classe QSvgRenderer no módulo QtSvg que pode renderizar a imagem em QPaintDevice. Este pode ser QImage. Nesse caso, criaremos:

Image svgBufferImage(renderer.defaultSize(), QImage::Format_ARGB32);

Mas como renderizar para um QImage de tamanho diferente do padrão do renderizador SVG? Como a imagem no formato SVG pode ser dimensionada sem perda de qualidade, é possível gerar imagens estáticas, como PNG, a partir de arquivos SVG usando QSvgRenderer?

Alguém tem uma idéia melhor? Basicamente, preciso criar imagens como PNG a partir de arquivos SVG em tamanhos diferentes.

23
Franki

Apenas dê ao seu QImage o tamanho desejado. O renderizador SVG será dimensionado para caber na imagem inteira.

#include <QApplication>
#include <QSvgRenderer>
#include <QPainter>
#include <QImage>

// In your .pro file:
// QT += svg 

int main(int argc, char **argv)
{
    // A QApplication instance is necessary if fonts are used in the SVG
    QApplication app(argc, argv);

    // Load your SVG
    QSvgRenderer renderer(QString("./svg-logo-h.svg"));

    // Prepare a QImage with desired characteritisc
    QImage image(500, 200, QImage::Format_ARGB32);
    image.fill(0xaaA08080);  // partly transparent red-ish background

    // Get QPainter that paints to the image
    QPainter Painter(&image);
    renderer.render(&Painter);

    // Save, image format based on file extension
    image.save("./svg-logo-h.png");
}

Isso criará uma imagem PNG de 500 x 200 a partir do arquivo SVG passado.

Exemplo de saída com uma imagem SVG da página logotipos SVG :

enter image description here

47
Mat

Aqui está a resposta completa:

QImage QPixmap::toImage() 

Se o pixmap tiver profundidade de 1 bit, a imagem retornada também terá 1 bit de profundidade. Imagens com mais bits serão retornadas em um formato que representa de perto o sistema subjacente. Normalmente, será QImage :: Format_ARGB32_Premultiplied para pixmaps com um alfa e QImage :: Format_RGB32 ou QImage :: Format_RGB16 para pixmaps sem alfa.

QImage img = QIcon("filepath.svg").pixmap(QSize(requiredsize)).toImage()

Copie também da resposta acima

// Save, image format based on file extension
image.save("./svg-logo-h.png");
6
Yash