Windows gdi 屏幕采集

2024-08-29 05:58
文章标签 windows 采集 屏幕 gdi

本文主要是介绍Windows gdi 屏幕采集,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在Windows开发有时需要实现截屏、桌面推送功能,网上搜的方案大多为ffmpeg实现。如果这个功能要放在sdk则引入的ffmpeg会导致模块体积太大。我参考ffmepg截屏部分的源码,在Windows上用的是gdi bitblt截屏,这完全可以自己用gdi实现一个截屏模块。最终实现如下,整个功能模块只依赖于<Windows.h>头文件,效果与ffmpeg基本一致,如果不是追求极致性能(mirro driver、duplication)的截屏,这种实现还是有价值的。下面是头文件的定义:

#pragma once
#include"IVideoCapture.h"
/************************************************************************
* @Project:      GdiScreenCapture
* @Decription:  Gdi屏幕采集工具
* @Verision:      v1.0.0.1
* @Author:      Xin 
* @Create:      2020/3/12 16:26:00
* @LastUpdate:  2020/4/03 15:24:00
************************************************************************
* Copyright @ 2020. All rights reserved.
************************************************************************/
namespace Common{
/// <summary>
/// Gdi屏幕采集对象
/// </summary>
class  GdiScreenCapture:IVideoCapture
{
public:    /// <summary>/// 采集区域的模式/// </summary>enum RectMode {/// <summary>/// 按实际计算/// </summary>TrueValue,/// <summary>/// 按比例计算/// </summary>RatioValue};    
public:/// <summary>/// 构造函数/// </summary>/// <param name="callback">[in]回调接口对象</param>/// <param name="hwnd">[in]窗口句柄,为NULL时采集屏幕</param>/// <param name="format">[in]输出的像素格式</param>GdiScreenCapture(void* hwnd, PixelFormat format);/// <summary>/// 析构函数/// </summary>~GdiScreenCapture();// 通过 IVideoCapture 继承virtual void SetCallback(Common::IVideoCaptureCallback *) override;/// <summary>/// 设置采集区域,可动态设置 -线程安全/// </summary>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]x坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="rectMode">[in]采集区域计算方式。TrueValue为实际值。RatioValue为比例值范围0-1,全屏设为0,0,1,1。</param>void SetRect(float x, float y, float width, float height, RectMode rectMode);/// <summary>/// 设置采集帧率,可动态设置 -线程安全/// </summary>/// <param name="framerate">采集帧率fps</param>void SetFramerate(float framerate);/// <summary>/// 开启采集/// </summary>void Start();/// <summary>/// 停止采集/// </summary>void Stop();/// <summary>/// 快照图片缓存/// </summary>/// <param name="hwnd">[in]窗口句柄,为NULL时采集屏幕</param>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]y坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="format">[in]输出的像素格式</param>/// <param name="buf">[in]图片缓存,由调用者初始化</param>/// <param name="len">[in]图片缓存的长度,由调用者提供</param>/// <returns>返回图像数据的长度</returns>static int  Snapshot(void* hwnd, int x, int y, int width, int height, PixelFormat  format, unsigned char* buf, size_t len);/// <summary>/// 快照保存文件,bmp格式/// </summary>/// <param name="hwnd">[in]窗口句柄,为NULL时截取屏幕</param>/// <param name="x">[in]x坐标</param>/// <param name="y">[in]y坐标</param>/// <param name="width">[in]宽</param>/// <param name="height">[in]高</param>/// <param name="filename">[in]保存的文件名</param>static void Snapshot(void* hwnd, int x, int y, int width, int height, const  char* filename);
private:void*_implement;};
}

 采用pimp的设计头文件依赖较少,功能上支持:设置截屏的窗口句柄,设置截屏帧率,设置输出格式(bgr24、yu12、nv12等)。具体项目如下:

https://download.csdn.net/download/u013113678/32905774

这篇关于Windows gdi 屏幕采集的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1117036

相关文章

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

javafx 如何将项目打包为 Windows 的可执行文件exe

《javafx如何将项目打包为Windows的可执行文件exe》文章介绍了三种将JavaFX项目打包为.exe文件的方法:方法1使用jpackage(适用于JDK14及以上版本),方法2使用La... 目录方法 1:使用 jpackage(适用于 JDK 14 及更高版本)方法 2:使用 Launch4j(

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Python使用pysmb库访问Windows共享文件夹的详细教程

《Python使用pysmb库访问Windows共享文件夹的详细教程》本教程旨在帮助您使用pysmb库,通过SMB(ServerMessageBlock)协议,轻松连接到Windows共享文件夹,并列... 目录前置条件步骤一:导入必要的模块步骤二:配置连接参数步骤三:实例化SMB连接对象并尝试连接步骤四:

在 Windows 上部署 gitblit

在 Windows 上部署 gitblit 在 Windows 上部署 gitblit 缘起gitblit 是什么安装JDK部署 gitblit 下载 gitblit 并解压配置登录注册为 windows 服务 修改 installService.cmd 文件运行 installService.cmd运行 gitblitw.exe查看 services.msc 缘起

Windows如何添加右键新建菜单

Windows如何添加右键新建菜单 文章目录 Windows如何添加右键新建菜单实验环境缘起以新建`.md`文件为例第一步第二步第三步 总结 实验环境 Windows7 缘起 因为我习惯用 Markdown 格式写文本,每次新建一个.txt后都要手动修改为.md,真的麻烦。如何在右键新建菜单中添加.md选项呢? 网上有很多方法,这些方法我都尝试了,要么太麻烦,要么不凑效

Windows下Nginx的安装及开机启动

1、将nginx-1.16.1.zip解压拷贝至D:\web\nginx目录下。 2、启动Nginx,两种方法: (1)直接双击nginx.exe,双击后一个黑色的弹窗一闪而过。 (2)打开cmd命令窗口,切换到nginx目录下,输入命令 nginx.exe 或者 start nginx ,回车即可。 3、检查nginx是否启动成功。 直接在浏览器地址栏输入网址 http://lo

Windows环境利用VS2022编译 libvpx 源码教程

libvpx libvpx 是一个开源的视频编码库,由 WebM 项目开发和维护,专门用于 VP8 和 VP9 视频编码格式的编解码处理。它支持高质量的视频压缩,广泛应用于视频会议、在线教育、视频直播服务等多种场景中。libvpx 的特点包括跨平台兼容性、硬件加速支持以及灵活的接口设计,使其可以轻松集成到各种应用程序中。 libvpx 的安装和配置过程相对简单,用户可以从官方网站下载源代码

Verybot之OpenCV应用一:安装与图像采集测试

在Verybot上安装OpenCV是很简单的,只需要执行:         sudo apt-get update         sudo apt-get install libopencv-dev         sudo apt-get install python-opencv         下面就对安装好的OpenCV进行一下测试,编写一个通过USB摄像头采