2011-12-18 4 views
13

이미지를 QPaintDevice에 렌더링 할 수있는 QtSvg 모듈에는 QSvgRenderer 클래스가 있습니다. 이것은 QImage 일 수 있습니다.QImage에 크기 조정 SVG를 렌더링하는 방법은 무엇입니까?

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

을하지만 어떻게 SVG 렌더러에서 기본값이 아닌 다른 크기의 QImage에 렌더링 :이 경우 우리가 만들 것인가? SVG 형식 이미지는 품질 손실없이 확장 될 수 있으므로 QSvgRenderer을 사용하여 SVG 파일에서 PNG와 같은 정적 이미지를 생성 할 수 있습니까?

누구에게 더 좋은 아이디어가 있습니까? 기본적으로 다른 크기의 SVG 파일에서 PNG와 같은 이미지를 만들어야합니다.

답변

31

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 logos 페이지에서 SVG 이미지 출력 예 : 픽스맵 1 비트의 깊이를 갖는 경우, 반환 된 이미지는 것

QImage QPixmap::toImage() 

: 여기

enter image description here

+0

와우 위에서 복사! 나는 그것을 시험했다;) 고마워, 매력처럼 작동한다;) – Franki

+0

더 간단한 해결책을 위해 이것을 보라. @stackoverflow.com/questions/10079011/qpixmap-and-svg/36936216#answer-36936216 – Yash

+0

@Yash : 그러나 여기서의 질문은 스케일링을 요구합니다. (위의 대답은 필요한 것보다 약간 복잡하지만 데 필요한 다른 것들을 데모합니다.) – Mat

3

완료 해답 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"); 
관련 문제