web-dev-qa-db-ja.com

スケーリングされたSVGをQImageにレンダリングする方法は?

QSvgRendererモジュールにはQtSvgクラスがあり、画像をQPaintDeviceにレンダリングできます。これはQImageにすることができます。その場合、以下を作成します。

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

しかし、SVGレンダラーからデフォルトとは異なるサイズのQImageにレンダリングする方法は? SVG形式の画像は品質を損なうことなく拡大縮小できるため、QSvgRendererを使用してSVGファイルからPNGなどの静的画像を生成することは可能ですか?

誰かがより良いアイデアを持っていますか?基本的に、さまざまなサイズのSVGファイルからPNGなどの画像を作成する必要があります。

23
Franki

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

これにより、渡されたSVGファイルから500x200のPNG画像が作成されます。

SVGロゴ ページからのSVG画像の出力例:

enter image description here

47
Mat

ここに完全な答えがあります:

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");
6
Yash