2011-12-18 26 views
13

Có một lớp QSvgRenderer trong mô hình QtSvg có thể hiển thị hình ảnh lên QPaintDevice. Cái này có thể là QImage. Trong trường hợp đó, chúng tôi sẽ tạo:Làm cách nào để hiển thị SVG được chia tỷ lệ thành QImage?

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

Nhưng cách hiển thị một kích thước khác với mặc định từ trình kết xuất SVG? Vì hình ảnh định dạng SVG có thể được thu nhỏ mà không bị mất chất lượng, có thể tạo ra các hình ảnh tĩnh, như PNG, từ các tệp SVG sử dụng QSvgRenderer không?

Có ai có ý tưởng hay hơn không? Về cơ bản, tôi cần tạo các hình ảnh như PNG từ các tệp SVG ở các kích thước khác nhau.

Trả lời

31

Chỉ cần cung cấp cho bạn QImage kích thước mong muốn. Trình kết xuất SVG sẽ mở rộng để vừa với toàn bộ hình ảnh.

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

Điều này sẽ tạo hình ảnh PNG 500x200 từ tệp SVG được truyền vào.

đầu ra Ví dụ với một hình ảnh SVG từ SVG logos page:

enter image description here

+0

Chà! Tôi đã thử nghiệm nó;) Cảm ơn người đàn ông, nó hoạt động như một sự quyến rũ;) – Franki

+0

Xem điều này cho giải pháp đơn giản http://stackoverflow.com/questions/10079011/qpixmap-and-svg/36936216#answer-36936216 – Yash

+0

@Yash: đơn giản hơn, nhưng câu hỏi ở đây đặc biệt yêu cầu mở rộng quy mô. (Câu trả lời ở trên phức tạp hơn một chút so với cần thiết ngay cả đối với điều đó, nhưng trình diễn những thứ khác mà bạn có thể cần/muốn.) – Mat

3

Dưới đây là câu trả lời hoàn chỉnh:

QImage QPixmap::toImage() 

Nếu pixmap có độ sâu 1-bit, hình ảnh trở lại cũng sẽ sâu 1 bit. Hình ảnh có nhiều bit hơn sẽ được trả về theo định dạng chặt chẽ đại diện cho hệ thống cơ bản. Thông thường điều này sẽ được QImage :: Format_ARGB32_Premultiplied cho pixmaps với một alpha và QImage :: Format_RGB32 hoặc QImage :: Format_RGB16 cho pixmaps mà không có alpha.

QImage img = QIcon("filepath.svg").pixmap(QSize(requiredsize)).toImage() 

Cũng sao chép từ bên trên câu trả lời

// Save, image format based on file extension 
image.save("./svg-logo-h.png"); 
Các vấn đề liên quan