Как визуализировать масштабированный 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
      }
  }
Другие вопросы по тегам