2011-12-18 17 views
13

Hay una clase QSvgRenderer en el módulo QtSvg que puede representar la imagen en QPaintDevice. Este puede ser QImage. En ese caso, vamos a crear:¿Cómo renderizar un SVG escalado a una QImage?

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

Pero el modo de hacer a un QImage de tamaño diferente al predeterminado desde el procesador de SVG? Dado que la imagen de formato SVG se puede escalar sin pérdida de calidad, ¿es posible generar imágenes estáticas, como PNG, desde archivos SVG utilizando QSvgRenderer?

¿Alguien tiene una idea mejor? Básicamente, necesito crear imágenes como PNG desde archivos SVG en diferentes tamaños.

Respuesta

31

Simplemente proporcione a su QImage el tamaño deseado. El renderizador SVG se escalará para adaptarse a toda la imagen.

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

Esto creará una imagen PNG 500x200 del archivo SVG pasado.

Ejemplo de salida una imagen SVG con desde la página SVG logos:

enter image description here

+0

Wow! Lo probé;) Gracias, hombre, funciona como un encanto;) – Franki

+0

Consulte esto para una solución más simple http://stackoverflow.com/questions/10079011/qpixmap-and-svg/36936216#answer-36936216 – Yash

+0

@Yash: más simple, pero la pregunta aquí específicamente pide escalar. (La respuesta anterior es un poco más compleja de lo necesario incluso para eso, pero demuestra otras cosas que pueda necesitar/desee). – Mat

3

Aquí es respuesta completa:

QImage QPixmap::toImage() 

Si el mapa de pixels tiene profundidad de 1 bit, la imagen devuelta también ser 1 bit de profundidad Las imágenes con más bits se devolverán en un formato que representa de cerca el sistema subyacente. Por lo general, esto será QImage :: Format_ARGB32_Premultiplied para pixmaps con alfa y QImage :: Format_RGB32 o QImage :: Format_RGB16 para pixmaps sin alfa.

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

También copiar desde arriba respuesta

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