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
    评论
QuickEncrypt,数据安全小工具,采用托盘图标、悬浮窗、鼠标拖拽、右键菜单的简单操作模式,提供文件、文本的加解密(RC4+AES)、Hash(MD5+SHA1)、安全擦除等功能。独有的“智能压缩”加密模式。 1.功能介绍 对鼠标拖入的文本进行加解密 对剪贴板中的文本进行加解密 对鼠标拖入的文件进行加解密 对鼠标拖入的文件进行擦除 对鼠标拖入的文本进行Hash计算 对剪贴板中的文本进行Hash计算 对鼠标拖入的文件进行Hash计算 针对文本和文件加解密的智能数据压缩技术 支持超过4GB的大文件 2.安全机制 2.1 文件擦除策略 a.修改文件名为随机串; b.以32字节的块向文件写入全0; c.刷新数据,关闭文件; d.修改文件名为随机串; e.以32字节的块向文件写入全1; f.刷新数据,关闭文件; g.截断文件大小为0; h.删除文件。 经测试常用数据恢复软件无法成功恢复原有数据。 2.2 Hash算法 使用OpenSSL 0.98提供的MD5(128位)和SHA1(160位)算法。 2.3 加解密密钥生成 将用户输入的密码明文转换成utf-8字节数组(不包含0结束符),计算MD5和SHA1,将MD5结果用作AES 128位密钥,将SHA1结果用作RC4密钥。 2.4 文本加密策略 a.将明文数据转换成utf-8字节数组(包含0结束符); b.对明文字节数组计算CRC32校验码,用于解密时校验,并将CRC32值在明文首字节之前; c.尝试压缩步骤b的结果(zlib level9),若获得较小的压缩结果则输出压缩后的编码数组,否则弃压缩,直接输出步骤b的结果; d.对步骤c的结果进行RC4流加密(OpenSSL 0.98); e.对步骤d的结果进行AES_CFB_128分组加密(OpenSSL 0.98); f.对步骤e的结果进行Base64编码(OpenSSL 0.98); g.将标记"QE:|"附加在步骤f的结果之前,输出结果。 2.5 文件加密策略 a.判断输入文件的扩展名是否是压缩格式,对常见压缩格式和流媒体编码文件不启用数据压缩功能; b.以1MB大小分块,读入明文文件数据; c.对分块的明文数据计算MD5,附加在待加密数据之前,用于解密时校验; d.尝试压缩1MB大小的分块,若获得较小的压缩结果则输出压缩后的编码数据,否则直接输出原文; e.对步骤d的结果进行RC4流加密(OpenSSL 0.98); f.对步骤e的结果进行AES_CFB_128分组加密(OpenSSL 0.98); g.将分块数据依次写入输出文件,输出文件的文件名是在原文件名后加".enc"。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值