Qt 截屏的方法

这篇具有很好参考价值的文章主要介绍了Qt 截屏的方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近一个Qt(C++)的项目需要用到截屏的功能,就花时间研究了一下如何实现。
Qt 确实是好用,截屏只需要下面三行代码就够了。

1 QDesktopWidget *desk = QApplication::desktop();
2 QScreen * screen = QGuiApplication::primaryScreen();
3 QPixmap p = screen->grabWindow(desk->winId());

这三行代码第一行是获取桌面的窗体对象。
第二行是获得一个 QScreen 对象。
第三行是截取屏幕上窗体对象所在区域的图像。

截取的结果是个QPixmap ,如果需要进一步处理的话,可以转化为 QIamge,一行代码就可以了。

QImage image = p.toImage();

原理就这么简单,但是我将这个代码封装了一下,将截屏功能封装成了一个 Camera。一次截屏操作就相当于相机拍一张照片。这样的好处是我这里有大量的相机图像处理的代码模块。将截屏封装成相机之后,就可以非常便捷的连接我的既有代码了。这种方法在设计模式中成为“适配器模式”。

下面是代码:

  1 #ifndef SCREENCAMERA_H
  2 #define SCREENCAMERA_H
  3 
  4 #include <QThread>
  5 #include <QObject>
  6 #include <QScreen>
  7 #include <QTimer>
  8 
  9 class ScreenCamera;
 10 
 11 /**
 12  * @brief The ScreenCameraInfo class 查询屏幕相机的信息的类
 13  * 用这个类可以查到当前计算机接了几个显示器,给出每个显示器的名称(deviceName)
 14  */
 15 class ScreenCameraInfo
 16 {
 17     friend class ScreenCamera;
 18 public:
 19     explicit ScreenCameraInfo(QScreen * screen = nullptr);
 20     ScreenCameraInfo(const ScreenCameraInfo &info);
 21     /**
 22      * @brief description 没有实现,返回空字符串
 23      * @return 返回空字符串。
 24      */
 25     QString description() const;
 26     /**
 27      * @brief deviceName 给出屏幕的名称,比如 "\\\\.\\DISPLAY1", "VGA1" 一类的名称。
 28      * @return
 29      */
 30     QString deviceName() const;
 31     bool isNull() const;
 32     bool operator!=(const ScreenCameraInfo &other) const;
 33     ScreenCameraInfo &operator=(const ScreenCameraInfo &other);
 34     bool operator==(const ScreenCameraInfo &other) const;
 35 
 36     static QList<ScreenCameraInfo> availableCameras();
 37     static ScreenCameraInfo defaultCamera();
 38 
 39 private:
 40     QScreen* m_screen;
 41 };
 42 
 43 /**
 44  * @brief The ScreenCamera class 将截屏功能封装成一个相机,可以像相机一样的操作。
 45  */
 46 class ScreenCamera : public QThread
 47 {
 48     Q_OBJECT
 49 public:
 50     explicit ScreenCamera(QObject *parent = 0);
 51     explicit ScreenCamera(ScreenCameraInfo &info, QObject *parent = 0);
 52     /**
 53      * @brief openDevice 打开一个特定的截屏相机,当计算机连接了多个显示器时通过这个 info 指定截取某一个屏幕的图像
 54      * @param info
 55      * @return
 56      */
 57     bool openDevice(const ScreenCameraInfo &info);
 58     /**
 59      * @brief setFrameRate 设置定时截屏的帧率。这里模仿相机的帧率设置。
 60      * @param fps  frame per second 每秒的截屏数量。 [0.001 - 50]
 61      */
 62     void setFrameRate(double fps);
 63     /**
 64      * @brief setRoi 设置感兴趣的区域,利用这个函数我们可以只截取屏幕的一部分区域
 65      * @param x 截屏区域的起始X坐标
 66      * @param y 截屏区域的起始Y坐标
 67      * @param width 截屏区域的宽度,-1 表示完整的屏幕宽度
 68      * @param height 截屏区域的高度,-1 表示完整的屏幕高度
 69      */
 70     void setRoi(int x, int y, int width, int height);
 71     void run() override;
 72     /**
 73      * @brief capture 获取截屏图像
 74      * @return
 75      */
 76     QImage capture();
 77 signals:
 78     /**
 79      * @brief imageChanged 定时截取图像时没截取一帧图像就激发一次这个信号
 80      * @param image
 81      */
 82     void imageChanged(const  QImage& image);
 83 public slots:
 84     /**
 85      * @brief start 开始图像采集
 86      */
 87     void start();
 88     /**
 89      * @brief stop 停止图像采集
 90      */
 91     void stop();
 92 
 93 private:
 94     int m_sleepInterval;
 95     QScreen* m_screen;
 96     int m_x;
 97     int m_y;
 98     int m_width;
 99     int m_height;
100 };
101 
102 #endif // SCREENCAMERA_H
  1 #include "ScreenCamera.h"
  2 #include <QApplication>
  3 #include <QDesktopWidget>
  4 #include <QDebug>
  5 
  6 ScreenCameraInfo::ScreenCameraInfo(const ScreenCameraInfo &info)
  7     :m_screen(nullptr)
  8 {
  9     m_screen = info.m_screen;
 10 }
 11 
 12 ScreenCameraInfo::ScreenCameraInfo(QScreen * screen)
 13     :m_screen(nullptr)
 14 {
 15     m_screen = screen;
 16 }
 17 
 18 bool ScreenCameraInfo::isNull() const
 19 {
 20     return (m_screen == nullptr);
 21 }
 22 
 23 QString ScreenCameraInfo::description() const
 24 {
 25     return "";
 26 }
 27 QString ScreenCameraInfo::deviceName() const
 28 {
 29     if(m_screen == nullptr) return "";
 30     return m_screen->name();
 31 }
 32 
 33 ScreenCameraInfo ScreenCameraInfo::defaultCamera()
 34 {
 35     QScreen * w = QGuiApplication::primaryScreen();
 36     return ScreenCameraInfo(w);
 37 }
 38 
 39 QList<ScreenCameraInfo> ScreenCameraInfo::availableCameras()
 40 {
 41     QList<QScreen *> list = QGuiApplication::screens();
 42     QList<ScreenCameraInfo> info;
 43     foreach (QScreen * s, list)
 44     {
 45         ScreenCameraInfo i(s);
 46         info.append(i);
 47     }
 48 
 49     return info;
 50 }
 51 
 52 bool ScreenCameraInfo::operator!=(const ScreenCameraInfo &other) const
 53 {
 54     return (m_screen != other.m_screen);
 55 }
 56 
 57 ScreenCameraInfo & ScreenCameraInfo::operator=(const ScreenCameraInfo &other)
 58 {
 59     m_screen = other.m_screen;
 60     return *this;
 61 }
 62 
 63 bool ScreenCameraInfo::operator==(const ScreenCameraInfo &other) const
 64 {
 65     return m_screen == other.m_screen;
 66 }
 67 
 68 
 69 ScreenCamera::ScreenCamera(ScreenCameraInfo &info, QObject *parent) : QThread(parent)
 70 {
 71     m_screen = info.m_screen;
 72     m_sleepInterval = 500;
 73     m_x = 0;
 74     m_y = 0;
 75     m_width = -1;
 76     m_height = -1;
 77 }
 78 
 79 ScreenCamera::ScreenCamera(QObject *parent) : QThread(parent)
 80 {
 81     m_screen = nullptr;
 82     m_sleepInterval = 500;
 83     m_x = 0;
 84     m_y = 0;
 85     m_width = -1;
 86     m_height = -1;
 87 }
 88 
 89 bool ScreenCamera::openDevice(const ScreenCameraInfo &info)
 90 {
 91     m_screen = info.m_screen;
 92     return (m_screen);
 93 }
 94 
 95 void ScreenCamera::setFrameRate(double fps)
 96 {
 97     fps = qBound(0.001, fps, 50.0);
 98     m_sleepInterval = 1000 / fps;  
 99 }
100 
101 void ScreenCamera::setRoi(int x, int y, int width, int height)
102 {
103     if(m_screen)
104     {
105         QRect rect = m_screen->geometry();
106 
107         m_x = qBound(0, x, rect.width());
108         m_y = qBound(0, y, rect.height());
109         m_width = qBound(-1, width, rect.width());
110         m_height = qBound(-1, height, rect.height());
111     }
112 }
113 
114 void ScreenCamera::run()
115 {
116     while(1)
117     {
118         if(m_screen)
119         {
120             QDesktopWidget *desk = QApplication::desktop();
121             //qDebug() << "m_width = " << m_width;
122             //qDebug() << "m_height = " << m_height;
123             QPixmap p = m_screen->grabWindow(desk->winId(), m_x, m_y, m_width, m_height);
124             QImage image = p.toImage();
125             emit imageChanged(image);
126         }
127         msleep(m_sleepInterval);
128     }
129 }
130 
131 QImage ScreenCamera::capture()
132 {
133     if(m_screen)
134     {
135         QDesktopWidget *desk = QApplication::desktop();
136         QPixmap p = m_screen->grabWindow(desk->winId(), m_x, m_y, m_width, m_height);
137         QImage image = p.toImage();
138         return image;
139     }
140     return QImage();
141 }
142 
143 void ScreenCamera::stop()
144 {
145     terminate();
146 }
147 
148 void ScreenCamera::start()
149 {
150     QThread::start(QThread::InheritPriority);
151 }

用法很简答,下面给个代码片段:文章来源地址https://www.toymoban.com/news/detail-737021.html

1 ScreenCameraInfo info = ScreenCameraInfo::defaultCamera();
2 qDebug() << info.deviceName();
3 m_screenCamera = new ScreenCamera(info);
4 connect(m_screenCamera, SIGNAL(imageChanged(QImage)), m_cameraImage, SLOT(setImage(QImage)));
5 m_screenCamera->setRoi(0, 0, 500, 500);
6 m_screenCamera->start();

到了这里,关于Qt 截屏的方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 小米12s ultra,索尼xperia1 iv,数码相机 拍照对比

    首先说明所有的测试结果和拍摄数据我放到百度网盘了(地址在结尾) 我一直想知道现在的手机和相机差距有多大,到底差在哪儿? 先说结论: 1.1英寸的手机cmos(2022年) 6年前(2016)的入门款相机(m43画幅) 2.手机 不能换镜头,只能在特定的拍摄距离才能发挥出全部的实力.数码变焦画质损

    2024年02月09日
    浏览(70)
  • 2022-10-09 Android app禁止截屏方法 和 在禁止截屏的情况下录制屏幕

    一、APP有时候为了保护用户的隐私安全会禁止用户录屏和截屏,比如金融类的app等。可以在app的onCreate方法中添加这么一段代码       1、代码       2、效果图,禁止截屏   二、那在app禁止截屏的情况下如何录屏呢?        1、使用 scrcpy ,下载scrcpy          2、下载链接 

    2024年02月08日
    浏览(35)
  • OpenHarmony设备截屏的5种方式

    目录 方式1:系统控制中心 方式2:OHScrcpy投屏工具 方式3:DevEcoStudio截屏功能 方式4:hdc shell snapshot_display 方式5:hdc shell wukong 持续关注 演示视频: 【开鸿教学2.0】OpenHarmony截屏的5种方式_哔哩哔哩_bilibili 顶部下滑在控制中心里点击截屏 这种方式最普遍,截图后可到相册查

    2024年02月11日
    浏览(30)
  • 记录--产品:请给我实现一个在web端截屏的功能!

    最近产品又开始整活了,本来是毫无压力的一周,可以小摸一下鱼的,但是突然有一天跟我说要做一个在网页端截屏的功能。 作为一个工作多年的前端,早已学会了尽可能避开麻烦的需求,只做增删改查就行! 我立马开始了我的反驳,我的理由是市面上截屏的工具有很多的

    2024年02月05日
    浏览(41)
  • 【QT/OpenCV】QT实现张正友相机标定

    01、相机标定 机器视觉是采用相机成像来实现对三维场景的测量、定位、重建等过程。也是一个利用二维图像进行三维反推的过程,我们所处的世界是三维的,而图像或者照片是二维的。我们可以把相机认为是一个函数,输入量是一个三维场景,输出量是一幅二维图像。 正常

    2024年02月09日
    浏览(31)
  • 【其他-3C数码】电容屏和电阻屏的区别

    工作原理不同 电容屏利用电容原理工作,通过触摸屏上的电容板,可以i感知到人体电荷的变化,从而实现触摸操作。 电阻屏利用电阻原理工作,触摸时需要施加一定的压力,使两个电极之间的电阻发生变化,从而实现触摸操作。 灵敏度不同 电容屏灵敏度更高,可以感知到

    2024年01月16日
    浏览(26)
  • Qt OpenGL相机系统

    效果展示 一直偷懒没有学习OpenGL,乘着这段有点时间重新学习一下OpenGL,做一个简单的小工具,有助于后面理解OSG。我们都知道OpenGL中存在着下面几个坐标空间:模型空间(物体空间)、世界空间、观察空间(或者称作人眼空间)、裁剪空间以及屏幕空间。本质上他们是五个坐

    2024年02月05日
    浏览(38)
  • Qt 基于海康相机的视频绘图

    需求 在视频窗口上进行绘图,包括圆,矩形,扇形等 效果 :  思路: 自己取图然后转成QImage ,再向QWidget 进行渲染,根据以往的经验,无法达到很高的帧率。因此决定使用相机SDK自带的渲染功能,也就是传一个句柄给到sdk。但是这样视频渲染出来了,向上绘制图案,会被视

    2024年02月04日
    浏览(23)
  • Qt+opencv+Linux+海康工业相机连接

           本人需要在树莓派上部署深度学习推理模型 ,由于本实验室只有海康工业相机,因此通过借鉴博客和自主调试,完成了模型的部署。本文主要讲述如何在基于linux的Qt中成功连接海康工业相机,第一次尝试写博客,练练手感。       1、安装海康工业相机自带的MVS  

    2024年02月01日
    浏览(42)
  • 【使用VS开发的第一个QT项目——实现相机功能(包括QT下载、配置、摄像头程序)】

    下载链接 windows程序的后缀是.exe Ubuntu程序的后缀是.run 按照安装指示操作、注册QT,然后出现”选择“界面时 勾选“MinGW 7.3.0 64-bit”,“MSVC 2017 64-bit”;点击“Developer and Designer Tools”前的尖号,打开其中选项,勾选“MinGW 7.3.0 64-bit”。 在VS\\\"工具\\\"→\\\"扩展与更新\\\"→\\\"联机\\\"中搜

    2024年02月07日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包