Как сделать масштабированный SVG для QImage?
В модуле QtSvg
есть класс QSvgRenderer
, который может отображать изображение на QPaintDevice
. Это может быть QImage
. В этом случае мы создадим:
Image svgBufferImage(renderer.defaultSize(), QImage::Format_ARGB32);
Но как рендерить в QImage
разного размера, чем по умолчанию, из SVG-рендеринга? Поскольку изображение в формате SVG можно масштабировать без потери качества, можно ли создавать статические изображения, такие как PNG, из файлов SVG с помощью QSvgRenderer
?
У кого-то есть лучшая идея? В основном мне нужно создавать изображения, такие как PNG из SVG файлов разных размеров.
Ответы
Ответ 1
Просто укажите QImage
желаемый размер. Средство визуализации SVG будет масштабироваться, чтобы соответствовать всему изображению.
#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");
}
Это создаст изображение PNG размером 500x200 из переданного в SVG файле.
Пример вывода с изображением SVG с страницы SVG:
![enter image description here]()
Ответ 2
Вот полный ответ:
QImage QPixmap::toImage()
Если pixmap имеет 1-битную глубину, возвращенное изображение будет также иметь глубину в 1 бит. Изображения с большим количеством битов будут возвращены в формате, который представляет собой базовую систему. Обычно это будет QImage:: Format_ARGB32_Premultiplied для pixmaps с альфа и QImage:: Format_RGB32 или QImage:: Format_RGB16 для pixmaps без альфа.
QImage img = QIcon("filepath.svg").pixmap(QSize(requiredsize)).toImage()
Также скопируйте приведенный выше ответ
// Save, image format based on file extension
image.save("./svg-logo-h.png");