Qt5 编写 快速截图小工具[自动放背景画布、自动保存]

开发目的

  经常需要大量处理图片,主要的过程就是:收集来的图片截切并放入一定大小的底图中。通常用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");
    }
}

运行效果

**截图成功**
**截图加画布成功**

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值