经常需要大量处理图片,主要的过程就是:收集来的图片截切并放入一定大小的底图中。通常用QQ、微信的截图工具,由于每一步都需要确认、保存,然后在PS中裁剪大小,配底色。比较浪费时间,于是开发了这个小工具。
本程序的实现有些源于网络,如有侵权,请联系删除。
Qt 5.12 Windows 10
经测试,在Windows 7和10中正常使用。
不同于其它的截图工具,减少了界面的交互,提高了工作效率。
水平有限,希望各位大佬多提建议。
https://www.bilibili.com/video/BV1L8411H7Ph
QT 高效截图工具
定义了两个类和一个UI界面用于设置程序运行参数
主类:用于启动程序,创建截图工具类
图片处理类:用于截图后的图片裁切,保存等图片处理
关键代码:
//主类
public:
<...>
Canvas *screenCanvas; //截图处理类
QScreen *screen; //获取当前屏幕图像
<...>
private:
<.....>
QAction *setAction; //菜单设置事件
QAction *exitAction;//菜单退出事件
void readSetting();//读取ini设置
void writeSetting();//设置写入ini
<....>
private slots:
<...>
void slt_clickTray(QSystemTrayIcon::ActivationReason reason); //单击处理
void slt_setAction();//设置处理
void slt_exitAction();//退出处理
void on_btn_bk_color_clicked();//按键修改画布颜色
void on_btn_filepath_clicked();//按键修改保存路径
void on_cb_autosave_stateChanged();//自动保存勾选切换事件
void on_edit_width_textChanged();//改变画布宽度
void on_edit_height_textChanged();//改变画布高度
void on_cb_autorun_stateChanged();//随系统启动切换
void on_cb_autosetpic_stateChanged();//选择截图时是否放置于画布中央
<...>
//截图处理
void canvasInit(); //初始化
void initToolBar(); //工具栏初始化
void refrashToolBar();//刷新工具栏
public slots:
void slt_drawRect(); //画方框
void slt_drawText(); //添加文本
void slt_saveFile(); //保存到文件
void slt_saveClipboard(); //保存到剪切板
void slt_cancel(); //退出事件信号
void slt_changePenWidth(QString s); //修改框线尺寸
void slt_changePenColor(); //修改框线颜色
void slt_changePenStyle(int index); //修改框线类型
void slt_changeTextColor(); //修改文本颜色
void slt_changeTextFont(); //修改文本字体
private:
QPointF pointS; //鼠标绘制起点
QPointF pointE; //鼠标绘制终点
RectPaint shotArea; //截图区域
QList<RectPaint> rectList; //矩形列表
QList<TextPaint *> textList; //文本列表
QPointF pointDrag; //拖拽点
QPixmap fullPixmap; //原始全屏图片
QPixmap originalPixmap; //截图区域
QWidget *toolbar; //工具条
QPushButton *btn_saveFile; //保存到文件
QPushButton *btn_saveClipboard; //复制到剪贴板
QPushButton *btn_cancel; //取消
QPushButton *btn_drawRect; //画框
QPushButton *btn_drawText; //添加文本
QClipboard *clipboard; //系统剪贴板
void mousePressEvent(QMouseEvent *event); //鼠标点击处理事件
void mouseMoveEvent(QMouseEvent *event);//鼠标移动事件
void mouseReleaseEvent(QMouseEvent *event);//鼠标释放事件
void paintEvent(QPaintEvent *e); //画板事件
//保存至文件
void Canvas::slt_saveFile()
{
shootScreen(shotArea);
SYSTEMTIME st;
GetSystemTime(&st);
QString current_date =QString("%1-%2-%3%4%5").
arg(QString::number(st.wMonth)).
arg(QString::number(st.wDay)).
arg(QString::number(st.wHour)).
arg(QString::number(st.wMinute)).
arg(QString::number(st.wSecond));
QString fileName=SavePath+"/"+current_date+".jpg";
if (!isAutosave)
{
fileName = QFileDialog::getSaveFileName(this,tr("保存图片"),fileName,tr("JPEG File (*.jpg);;PNG File (*.png)"));
}
if(fileName.right(3) == "png")originalPixmap.save(fileName,"png",75);
if(fileName.right(3) == "jpg")originalPixmap.save(fileName,"jpg",75);
if (isAutoSetPic)//自动设置画布 开始处理
{
fileName=SavePath+"/"+current_date+"-加底.jpg";
QPixmap backColor(Pic_Width, Pic_Height);
QPainter p;
backColor.fill(QColor(PicBackColorRed,PicBackColorGreen,PicBackColorBlue));
p.begin(&backColor);
int x=0,y=0,w=originalPixmap.width(),h=originalPixmap.height();
float t;
//判断图片和画布大小 进行X和Y的定位
//计算长和宽谁的比例更大 有较大的比值计算W和H
t=float(originalPixmap.width())/float(Pic_Width) > float(originalPixmap.height())/float(Pic_Height)
? float(originalPixmap.width())/float(Pic_Width)
: float(originalPixmap.height())/float(Pic_Height) ;
h = float(h)/ t;
w = float(w)/ t;
x=(Pic_Width-w)/2;
y=(Pic_Height-h)/2;
p.drawPixmap(x,y,w,h,originalPixmap);
p.end();
backColor.save(fileName,"jpg",75);
}
slt_cancel(); //结束退出
}
//保存配置至文件
void QShotTool::writeSetting(){
QSettings settings("./setting.ini", QSettings::IniFormat); // 当前目录的INI文件
settings.setValue("Width",Pic_Width); //画布宽度
settings.setValue("Height",Pic_Height); //画布高度
settings.setValue("AutoRun",isAutoRun); //是否随系统启动
//开机自启动写注册表
if(isAutoRun){
QSettings *reg=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);
reg->setValue("QShot",QApplication::applicationFilePath().replace("/","\\"));
}
else
{
QSettings *reg=new QSettings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run",QSettings::NativeFormat);
reg->remove("QShot");
}
settings.setValue("AutoSetPic",isAutoSetPic); //自动放置画布
settings.setValue("PicBackColorRed",PicBackColorRed); //画布颜色
settings.setValue("PicBackColorGreen",PicBackColorGreen); //画布颜色
settings.setValue("PicBackColorBlue",PicBackColorBlue); //画布颜色
settings.setValue("FastSave",isAutosave); //快速保存
settings.setValue("SavePath",SavePath.replace("/","\\")); //存储路径
if(settings.value("ScreenShot").toString()=="") //快捷键
{
settings.setValue("ScreenShot","Ctrl+F1");
}
}