最近一个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 &a

文章介绍了如何使用Qt库通过三行代码实现截屏功能,并将截屏操作封装成一个名为ScreenCamera的类,模仿相机操作,支持帧率设置和感兴趣区域选择。这样可以方便地接入已有图像处理代码,利用的是适配器设计模式。
最低0.47元/天 解锁文章
5613

被折叠的 条评论
为什么被折叠?



