Как визуализировать масштабированный SVG в QImage?
E сть QSvgRenderer
класс в QtSvg
модуль, который может визуализировать изображение на QPaintDevice
, Этот может быть QImage
, В этом случае мы создадим:
Image svgBufferImage(renderer.defaultSize(), QImage::Format_ARGB32);
Но как сделать, чтобы QImage
другого размера, чем по умолчанию в рендере SVG? Поскольку изображение в формате SVG можно масштабировать без потери качества, возможно ли создавать статические изображения, например PNG, из файлов SVG, используя QSvgRenderer
?
У кого-нибудь есть идея получше? В основном мне нужно создавать изображения, такие как PNG из файлов SVG разных размеров.
3 ответа
Просто дай свой 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");
}
Это создаст 500x200 PNG-изображение из переданного в SVG-файла.
Пример вывода с изображением SVG со страницы логотипов SVG:
Вот полный ответ:
QImage QPixmap::toImage()
Если растровое изображение имеет глубину 1 бит, возвращаемое изображение также будет иметь глубину 1 бит. Изображения с большим количеством битов будут возвращены в формате, который представляет собой основную систему. Обычно это QImage::Format_ARGB32_Premultiplied для растровых изображений с альфа и QImage::Format_RGB32 или QImage::Format_RGB16 для растровых изображений без альфы.
QImage img = QIcon("filepath.svg").pixmap(QSize(requiredsize)).toImage()
Также скопируйте сверху ответ
// Save, image format based on file extension
image.save("./svg-logo-h.png");
Если у вас есть простой svg, например значок или небольшое изображение, для замены цвета, например, лучше использовать NanoSVG lib.
У него есть оболочка Qt, написанная мной Qt Svg Render.
Он очень маленький, всего 2 заголовка и один cpp.
Использование:
QString svgPath="your svg Path";
QString pngPath="path for png";
QSize imageSize(your image Path size);
const QSize resultSize(size that you want to get);
QImage image(sizeW, sizeH, Format);//End of param
QFile svgFile(svgPath);
if (svgFile.open(QIODevice::ReadOnly))
{
int svgFileSize=svgFile.size();
QByteArray ba;
ba.resize(svgFileSize + 1);
svgFile.read(ba.data(), svgFileSize);
ba.back() = {};
if (auto const nsi(nsvgParse(ba.data(), "px", 96)); nsi)
{
image.fill(Qt::transparent);
QPainter p(&image);
p.setRenderHint(QPainter::Antialiasing, true);
drawSVGImage(&p, nsi, resultSize.width(), resultSize.height());
nsvgDelete(nsi);
image.save(pngPath);// if you want to save image
}
}