svg转图片工具开发

SVG转图

在工作中我习惯使用plantuml绘画各种各样的流程图,plantUML可以很方便的专为svg图片。所以,我希望在linux操作系统将svg转成各种类型的图片,例如:png、jpg、jpeg、bmp等,但是转成的图片的分辨率是按照原始比例进行存储的,我在使用的图片的时候,放置在doc文档里面的时候并不是特别清晰。

基于以上,我自己使用Qt开发了一个简单的svg转图片工具。

当然svg转图片不一定需要使用工具。例如浏览器也可以转化。

为了使图片保存更加清晰,我将图片放大。这样就能使其更加清晰。

关键函数如下:

  m_svgRenderer.load(m_ptrLineEditFilePath->text());qInfo() << "m_svgRenderer" << m_svgRenderer.defaultSize();QPixmap _pixmapSvg =QPixmap(m_svgRenderer.defaultSize() * (m_currentIndex + 1));_pixmapSvg.fill(Qt::transparent);QPainter painter2(&_pixmapSvg);m_svgRenderer.render(&painter2, _pixmapSvg.rect());_pixmapSvg.save(m_ptrLineEditSaveFile->text());
QSvgRenderer m_svgRenderer:

使用QSvgRenderer将svg图片加载,然后使用render函数将其渲染到QPixmap中。然后将图片进行保存就可以了。pixmap的save函数可以根据图片地址后缀名进行对应的格式保存。

工具演示

选择svg文件:选择需要保存的图片svg文件

保存图片地址:获取待保存的图片地址

5倍:将原始图片放大x倍,用于保证其清晰度

生成:生成对用的图片格式的图片。

 

 

源码地址

SVGTools · master · 啊渊 / QT博客案例 · GitCode

mainwindow.cpp

#include "mainwindow.h"
#include 
#include 
#include 
#include 
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), m_ptrWdgMain(new QWidget()), m_ptrGridLayoutMain(new QGridLayout()), m_ptrLabSVGFilePath(new QLabel("选择")), m_ptrLineEditFilePath(new QLineEdit()), m_ptrBtnSelectSVGFile(new QPushButton("选择svg文件")), m_ptrLabSaveFile(new QLabel("保存")), m_ptrLineEditSaveFile(new QLineEdit()), m_ptrBtnSaveFile(new QPushButton("保存图片地址")), m_ptrBtnDoWork(new QPushButton("生成")), m_ptrCmbSelectPicType(new QComboBox()), m_currentIndex(0)
{initUI();initConnect();
}MainWindow::~MainWindow() {}void MainWindow::slotSelectSVGFile()
{QString file_name = QFileDialog::getOpenFileName(this, "open file dialog",QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),"SVG files(*.svg)");m_ptrLineEditFilePath->setText(file_name);
}void MainWindow::slotSelectSaveFile()
{QString filename = QFileDialog::getSaveFileName(this, tr("Save Image"),QStandardPaths::writableLocation(QStandardPaths::DesktopLocation),tr("*.bmp;; *.png;; *.jpg;; *.tif;; *.GIF"));if (filename.isEmpty()) {return;} else {m_ptrLineEditSaveFile->setText(filename);}
}void MainWindow::slotDoWork()
{if (m_ptrLineEditFilePath->text().isEmpty()) {return;}m_svgRenderer.load(m_ptrLineEditFilePath->text());qInfo() << "m_svgRenderer" << m_svgRenderer.defaultSize();QPixmap _pixmapSvg =QPixmap(m_svgRenderer.defaultSize() * (m_currentIndex + 1));_pixmapSvg.fill(Qt::transparent);QPainter painter2(&_pixmapSvg);m_svgRenderer.render(&painter2, _pixmapSvg.rect());_pixmapSvg.save(m_ptrLineEditSaveFile->text());
};void MainWindow::slotCurrentIndexChanged(int index)
{qInfo() << "slotCurrentIndexChanged" << index;
}void MainWindow::initUI()
{setWindowTitle(tr("svg图片转化工具"));m_ptrLineEditFilePath->setDisabled(true);m_ptrLineEditSaveFile->setDisabled(true);m_ptrGridLayoutMain->addWidget(m_ptrLabSVGFilePath, 0, 0);m_ptrGridLayoutMain->addWidget(m_ptrLineEditFilePath, 0, 1);m_ptrGridLayoutMain->addWidget(m_ptrBtnSelectSVGFile, 0, 2);m_ptrGridLayoutMain->addWidget(m_ptrLabSaveFile, 1, 0);m_ptrGridLayoutMain->addWidget(m_ptrLineEditSaveFile, 1, 1);m_ptrGridLayoutMain->addWidget(m_ptrBtnSaveFile, 1, 2);m_ptrGridLayoutMain->addWidget(m_ptrCmbSelectPicType, 2, 0, 1, 3);m_ptrCmbSelectPicType->addItem(tr("原始"));m_ptrCmbSelectPicType->addItem(tr("2倍"));m_ptrCmbSelectPicType->addItem(tr("3倍"));m_ptrCmbSelectPicType->addItem(tr("4倍"));m_ptrCmbSelectPicType->addItem(tr("5倍"));m_ptrCmbSelectPicType->addItem(tr("6倍"));m_ptrCmbSelectPicType->addItem(tr("7倍"));m_ptrCmbSelectPicType->setCurrentIndex(4);m_currentIndex = 4;m_ptrGridLayoutMain->addWidget(m_ptrBtnDoWork, 3, 0, 1, 3);m_ptrWdgMain->setLayout(m_ptrGridLayoutMain);setCentralWidget(m_ptrWdgMain);
}void MainWindow::initConnect()
{connect(m_ptrBtnSelectSVGFile, SIGNAL(clicked()), this,SLOT(slotSelectSVGFile()));connect(m_ptrBtnSaveFile, SIGNAL(clicked()), this,SLOT(slotSelectSaveFile()));connect(m_ptrBtnDoWork, SIGNAL(clicked()), this, SLOT(slotDoWork()));connect(m_ptrCmbSelectPicType, SIGNAL(currentIndexChanged(int)), this,SLOT(slotCurrentIndexChanged(int)));
}

mainwindow.h 

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include 
#include 
#include 
#include 
#include 
#include 
#include 
class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = 0);~MainWindow();public slots:void slotSelectSVGFile();void slotSelectSaveFile();void slotDoWork();void slotCurrentIndexChanged(int index);private:void initUI();void initConnect();private:QWidget *m_ptrWdgMain;QGridLayout *m_ptrGridLayoutMain;QLabel *m_ptrLabSVGFilePath;QLineEdit *m_ptrLineEditFilePath;QPushButton *m_ptrBtnSelectSVGFile;QLabel *m_ptrLabSaveFile;QLineEdit *m_ptrLineEditSaveFile;QPushButton *m_ptrBtnSaveFile;QPushButton *m_ptrBtnDoWork;QComboBox *m_ptrCmbSelectPicType;QSvgRenderer m_svgRenderer;int m_currentIndex;
};#endif  // MAINWINDOW_H


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部