¿Cómo representar un SVG escalado a una QImage?
qt (2)
Aquí está la respuesta completa:
QImage QPixmap::toImage()
Si el mapa de píxeles tiene una profundidad de 1 bit, la imagen devuelta también tendrá una profundidad de 1 bit. Las imágenes con más bits se devolverán en un formato que represente estrechamente al 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 copia de la respuesta anterior.
// Save, image format based on file extension
image.save("./svg-logo-h.png");
Hay una clase QSvgRenderer
en el módulo QtSvg
que puede representar la imagen en QPaintDevice
. Este puede ser QImage
. En ese caso crearemos:
Image svgBufferImage(renderer.defaultSize(), QImage::Format_ARGB32);
Pero, ¿cómo renderizar en una QImage
de un tamaño diferente al predeterminado del renderizador SVG? Dado que la imagen del formato SVG se puede escalar sin pérdida de calidad, ¿es posible generar imágenes estáticas, como PNG, a partir de archivos SVG utilizando QSvgRenderer
?
¿Alguien tiene una idea mejor? Básicamente necesito crear imágenes como PNG a partir de archivos SVG en diferentes tamaños.
Solo dale a tu QImage
el tamaño deseado. El renderizador SVG se escalará para adaptarse a la imagen completa.
#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 con una imagen SVG de la página de logotipos de SVG :