中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Qt如何實現屏幕錄制控件

發布時間:2021-12-15 11:11:20 來源:億速云 閱讀:362 作者:小新 欄目:互聯網科技

這篇文章主要介紹了Qt如何實現屏幕錄制控件,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

一、前言

在平時的寫作過程中,經常需要將一些操作動作和效果圖截圖成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));
    }
}

三、效果圖

Qt如何實現屏幕錄制控件

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Qt如何實現屏幕錄制控件”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

江川县| 五莲县| 桂东县| 高州市| 马山县| 驻马店市| 冷水江市| 铁岭市| 阳泉市| 米易县| 姜堰市| 磴口县| 民乐县| 九台市| 若尔盖县| 讷河市| 铜梁县| 曲阳县| 聂荣县| 巴彦淖尔市| 云阳县| 元朗区| 郓城县| 扶沟县| 建宁县| 沅江市| 安阳市| 泸溪县| 龙山县| 五河县| 临西县| 高陵县| 龙门县| 绥棱县| 葫芦岛市| 环江| 桂林市| 三都| 怀宁县| 汾阳市| 荔浦县|