zoukankan      html  css  js  c++  java
  • Qt开源作品11-屏幕录制控件

    一、前言

    在平时的写作过程中,经常需要将一些操作动作和效果图截图成gif格式,使得涵盖的信息更全面更生动,有时候可以将整个操作过程和运行效果录制成MP4,但是文件体积比较大,而且很多网站不便于上传,基本上都支持gif动图,一般一个5秒左右的gif,800*600分辨率,可以很好的控制在500KB内,这样就比较完美的支持各大网站上传动图。
    最开始使用的是ScreenGif.exe,用了很久,感觉还可以,后面一个朋友推荐用LICEcap.exe,体积更小,压缩比更高,再到后来发现有个gif.h开源的类,调用其中的方法可以实现将多张图片合并到一张gif中去,而且还是跨平台的,本人亲自在WIN+UBUNTU测试成功。
    最初的代码是倪大侠给的,我在此基础上重新完善了下,使得可以直接拖动窗体大小来改变录屏区域的大小。增加了对Qt4和其他编译器的支持。

    主要功能:

    1. 可设置要录制屏幕的宽高,支持右下角直接拉动改变.
    2. 可设置变宽的宽度
    3. 可设置录屏控件的背景颜色
    4. 可设置录制的帧数
    5. 录制区域可自由拖动选择

    二、代码思路

    void GifWidget::saveImage()
    {
        if (!gifWriter) {
            return;
        }
    
    #if (QT_VERSION <= QT_VERSION_CHECK(5,0,0))
        //由于qt4没有RGBA8888,采用最接近RGBA8888的是ARGB32,颜色会有点偏差
        QPixmap pix = QPixmap::grabWindow(0, x() + rectGif.x(), y() + rectGif.y(), rectGif.width(), rectGif.height());
        QImage image = pix.toImage().convertToFormat(QImage::Format_ARGB32);
    #else
        QScreen *screen = QApplication::primaryScreen();
        QPixmap pix = screen->grabWindow(0, x() + rectGif.x(), y() + rectGif.y(), rectGif.width(), rectGif.height());
        QImage image = pix.toImage().convertToFormat(QImage::Format_RGBA8888);
    #endif
    
        gif.GifWriteFrame(gifWriter, image.bits(), rectGif.width(), rectGif.height(), fps);
        count++;
        labStatus->setText(QString("正在录制 第 %1 帧").arg(count));
    }
    
    void GifWidget::record()
    {
        if (btnStart->text() == "开始") {
            if (0 != gifWriter) {
                delete gifWriter;
                gifWriter = 0;
            }
    
            //先弹出文件保存对话框
            //fileName = qApp->applicationDirPath() + "/" + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss.gif");
            fileName = QFileDialog::getSaveFileName(this, "选择保存位置", qApp->applicationDirPath() + "/", "gif图片(*.gif)");
            if (fileName.isEmpty()) {
                return;
            }
    
            int width = txtWidth->text().toInt();
            int height = txtHeight->text().toInt();
            fps = txtFps->text().toInt();
    
            gifWriter = new Gif::GifWriter;
            bool bOk = gif.GifBegin(gifWriter, fileName.toLocal8Bit().data(), width, height, fps);
            if (!bOk) {
                delete gifWriter;
                gifWriter = 0;
                return;
            }
    
            count = 0;
            labStatus->setText("开始录制...");
            btnStart->setText("停止");
            //延时启动
            timer->setInterval(1000 / fps);
            QTimer::singleShot(1000, timer, SLOT(start()));
            //saveImage();
        } else {
            timer->stop();
            gif.GifEnd(gifWriter);
    
            delete gifWriter;
            gifWriter = 0;
    
            labStatus->setText(QString("录制完成 共 %1 帧").arg(count));
            btnStart->setText("开始");
            QDesktopServices::openUrl(QUrl(fileName));
        }
    }
    

    三、效果图

    四、开源主页

    以上作品完整源码下载都在开源主页,会持续不断更新作品数量和质量,欢迎各位关注。

    1. 国内站点:https://gitee.com/feiyangqingyun/QWidgetDemo
    2. 国际站点:https://github.com/feiyangqingyun/QWidgetDemo
    3. 个人主页:https://blog.csdn.net/feiyangqingyun
    4. 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
  • 相关阅读:
    web架构设计经验分享(转)
    家庭反对死一批,朋友同事嘲笑死一批,害怕失败死一批,徘徊等待死一批「没有时间」又死一批(转)
    java.lang.ClassCastException: java.lang.NoClassDefFoundError cannot be cast to java.lang.RuntimeException
    Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(转)
    xcode armv6 armv7 armv7s arm64
    使用collectd与visage收集kvm虚拟机性能实时图形
    【OpenCV入门指南】第一篇 安装OpenCV
    《自己动手写CPU》写书评获赠书活动结果
    winzip15.0注冊码
    Atitit.ALT+TAB没反应车and 点击任务栏程序闪烁可是不能切换
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/12898854.html
Copyright © 2011-2022 走看看